1、套接字的創建和關閉 使用套接字之前,必須使用socket函數創建一個套接字,此函數調用成功將返回一個套接字句柄。 type參數指定套接字的類型。套接字有流套接字、數據報套接字和原始套接字。 SOCK_STREAM 流套接字,使用TCP提供有連接的可靠的傳輸。 SOCK_DGRAM 數據報套接字, ...
1、套接字的創建和關閉
使用套接字之前,必須使用socket函數創建一個套接字,此函數調用成功將返回一個套接字句柄。
1 SOCKET socket(
2 int af, //用來指定套接字使用的地址格式,Winsock中只能使用AF_INET
3 int type, //用來指定套接字的類型
4 int protocol //配合type參數使用,用來指定使用的協議類型。可以是IPPROTO_TCP等
5 );
type參數指定套接字的類型。套接字有流套接字、數據報套接字和原始套接字。
SOCK_STREAM 流套接字,使用TCP提供有連接的可靠的傳輸。
SOCK_DGRAM 數據報套接字,使用UDP提供無連接的不可靠的傳輸。
SOCK_RAW 原始套接字,由程式自行處理數據報以及協議首部。
當type參數明確為SOCK_STREAM和SOCK_DGRAM時,protocol參數的值可為0。
函數調用失敗時返回INVALID_SOCKET(-1),可通過WSAGetLastError取得錯誤代碼。
當不使用創建的套接字時,應調用closesocket函數來關閉套接字。沒有發生錯誤則返回0,否則返回SOCKET_ERROR。
1 int closesocket(SOCKET s); //函數唯一的參數就是要關閉的套接字
2、綁定套接字到指定的IP地址和埠號:bind函數
1 int bind(
2 SOCKET s, //套接字句柄
3 const struct sockaddr* name, //要關聯的本機地址
4 int namelen //地址的長度
5 )
綁定函數安排一個本地名稱到未命名的socket而建立此socket的本地關聯。本地名稱包括三部分:主機地址、協議號(TCP和UDP)和埠號。
1 sockaddr_in sin; 2 sin.sin_family = AF_INET; //地址協議家族 3 sin.sin_port = htons(4567); //埠 4 sin.sin_addr.S_un.S_addr = INADDR_ANY; //監聽的IP地址 5 if(::bind(sListen,(LPSOCKET)&sin,sizeof(sin)) == SOCKET_ERROR) 6 { 7 printf("Failed bind()\n"); 8 return 0; 9 }
3、設置套接字進入監聽狀態:listen函數
1 int listen(
2 SOCKET s, //套接字句柄
3 int backlog //監聽隊列中允許保持的尚未處理的最大連接數量
4 );
listen僅應用在支持連接的套接字上。函數執行成功後,套接字s進入被動模式,到來的連接會被通知要排隊等候接受處理。
在同一時間處理多個連接請求的伺服器通常使用listen函數,如果一個連接請求到達,且排隊已滿,客戶端將收到WSAECONNREFUSED錯誤。
4、接受連接請求:accept函數
1 SOCKET accept(
2 SOCKET s, //套接字句柄
3 struct sockaddr* addr, //一個指向sockaddr_in結構的指針,用於取得對方的地址信息
4 int* addrlen //一個指向地址長度的指針
5 );
該函數預設工作在阻塞模式下。函數在s上取出未處理連接中的第一個連接,為這個連接創建新的套接字,返回它的句柄。新創建的套接字是處理實際連接的套接字,與s有相同的屬性。
addrlen參數用於指定addr所指空間的大小,也用於返回地址的實際長度。如果為NULL,則沒有關於遠程地址的信息返回。
客戶端程式在創建套接字之後,需要使用connect函數請求與伺服器進行連接。
1 int connect(
2 SOCKET s, //套接字句柄
3 const struc sockaddr FAR* name, //一個指向sockaddr_in結構的指針,包含了要連接的伺服器的信息
4 int namelen //sockaddr_in結構的指針
5 );
第一個參數所說的套接字句柄指的是客戶端的套接字,而另外兩個參數都是用來定址遠程套接字,即伺服器端的監聽套接字。
5、收發數據
對於流套接字,一般使用send和recv函數來收發數據。
1 int send(
2 SOCKET s, //套接字句柄
3 const char FAR* buf, //要發送數據的緩衝區地址
4 int len, //緩衝區長度
5 int flags //指定了調用方式,一般設為0
6 );
1 int recv(SOCKET s,char FAR* buf,int len,int flags);
最後解釋一下什麼是套接字及其作用:
套接字是支持TCP/IP網路通信的基本操作單元,可以看做不同主機之間的進程進行雙向通信的端點。簡單說就是通信雙方的一種約定,用套接字中的相關函數可以完成通信過程。