Socket 程式設計概述

2021-08-21 07:56:49 字數 3125 閱讀 3368

標籤(空格分隔): 計算機網路

網路程式設計的世界裡面,有各個層次的網路程式設計介面,這些介面給予我們針對不同的層次對網路進行操控,常見有下圖這些層次的介面

使用哪個層次的介面可以對實際對那個層次進行控制。

而我們常用的應用程式設計 api 則是應用層和傳輸層之間的網路程式設計介面,通過這個系統呼叫 api 切換應用程式和作業系統的控制權

幾種典型的應用程式設計介面:

通訊模型:客戶/伺服器(c/s)

socket 作為應用程序通訊的一種抽象機制,他就像是乙個客戶端的插頭插到了伺服器對應的插座

我們知道,對外標識通訊端點位址是ip 位址 + 埠號, 那麼作業系統和程序實際上是如何管理套接字的呢?實際上每當建立乙個套接字的時候,作業系統會返回乙個小整數作為描述符來標識這個套接字,而應用程式則使用這個描述符來引用該套接字

更進一步地說,socket 其實也是類似檔案的一種抽象,當應用程序建立套接字時,作業系統分配乙個資料結構儲存該套接字相關資訊,並返回套接字描述符。另外在作業系統內部維護著乙個 socket 描述符表,根據套接字描述符可以引用 socket 的乙個資料結構,裡面包含了兩個端點通訊需要的所有東西通訊協議、本地協議位址、本地主機埠、遠端主機位址和遠端協議埠。

針對使用 windows 上的 winsock 進行網路應用程式設計的時候,我們一般要走這樣的流程

建立乙個新的確定型別的套接字,型別用乙個整型數值標識(檔案描述符),並為它分配系統資源。

int socket(int domain, int type, int protocol);有三個引數:

type(socket型別)如下:

protocol 指定實際使用的傳輸協議。 最常見的就是ipproto_tcpipproto_sctpipproto_udpipproto_dccp。這些協議都在

原型int bind(int sockfd, const struct sockaddr *my_addr, socklen_t addrlen);

bind() 為乙個套接字分配位址。當使用socket()建立套接字後,只賦予其所使用的協議,並未分配位址。在接受其它主機的連線前,必須先呼叫bind()為套接字分配乙個位址。bind()有三個引數:

需要注意的是,客戶端程式一般不必呼叫 bind() 函式,因為作業系統會自動完成這個工作指定不會衝突的隨機埠

而伺服器則是需要 bind() 的,因為伺服器需要指定這個埠讓客戶端找到它使用這個特殊指定的服務。

原型int listen(int sockfd, int backlog);

當socket和乙個位址繫結之後,listen()函式會開始監聽可能的連線請求。然而,這只能在有可靠資料流保證的時候使用,例如:資料型別(sock_stream, sock_seqpacket)

listen()函式需要兩個引數:

一旦連線被接受,返回0表示成功,錯誤返回-1。

原型int closesocket(int sockfd)

返回值:

原型int connect(int sockfd, const struct sockaddr *serv_addr, socklen_t addrlen);

原型int accept(int sockfd, struct sockaddr *cliaddr, socklen_t *addrlen);

當應用程式監聽來自其他主機的面對資料流的連線時,通過事件通知它。必須用accept()函式初始化連線。accept()為每個連線建立新的套接字並從監聽佇列中移除這個連線。它使用如下引數:

返回新的套接字描述符,出錯返回-1。進一步的通訊必須通過這個套接字。

datagram 套接字不要求用accept()處理,因為接收方可能用監聽套接字立即處理這個請求。

原型send(sd, *buf, len, flags);

sendto(sd, *buf, len, flags, destaddr, addrlen);

原型recv(sd, *buffer, len, flags);

維基百科

哈工大計算機網路慕課

socket程式設計

一直以為serversocket accept之後客戶端才能發資訊,實驗後得出如下結論 1 serversocket沒有accept時,client是可以傳送資訊到server端的。2 serversocket accept之後,正在處理訊息時,client也是可以傳送資訊到server端。如果se...

Socket程式設計

對tcp ip udp socket程式設計這些詞你不會很陌生吧?隨著網路技術的發展,這些詞充斥著我們的耳朵。那麼我想問 1.什麼是tcp ip udp?2.socket在 呢?3.socket是什麼呢?4.你會使用它們嗎?什麼是tcp ip udp?tcp ip transmission cont...

socket程式設計

建立socket 建立乙個 socket,它可用於在基於 tcp ip 的網路 如 internet 上通訊。socket s new socket addressfamily.internetwork,sockettype.stream,protocoltype.tcp 若要使用 udp 而不是 ...