TCP部分
標頭檔Winsock32.h
庫檔案ws2_32.lib
(註:以下在伺服器和用戶端都能發送和接收)
伺服器:
WSAData wsaData;
int error;
error = WSAStartup( MAKEWORD( 2, 2 ), &wsaData );
然後判斷error值!=,返回;
然後判斷是否被DLL支援
socket(,,)
第一個參數必須:AF_INET,表示地址協議族
第二個參數:a.SOCK_DGRAM,b.SOCK_STREAM. a是UDP類型,b是TCP類型
第三個參數:最好為0,他會根據地址類型和通訊端類別,自動為你選擇一個合適的協議
調用成功則返回一個SOCK類型的資料類型描述符,如果失敗,這個就會返回一個INVALID_SOCKET,錯誤資訊可以通過WSAGetLastError函數返回。
bind(,,)
第一個參數為要綁定的socket.
第二個參數指定該通訊端的本地地址資訊,是指向sockaddr結構的指標變數,對於不同協議不同(所以我們要用到第三個參數sizeof(sockddr)),在TCP/IP協議中,我們可以用socketaddr_in結構代替sockaddr。
struct socketaddr_in
{
short sin_family;//這個固定為AF_INET,
unsigned short sin_port;//連接埠號碼,注意,這裡必須用網路位元組序,調用函數htons函數
struct in_addr sin_addr;//IP地址,如果指定為INADDR_ANY,則允許通訊端向任何分配給原生IP地址發送或者接收資料,這對於有多個網卡的機器來說,就簡化了程式的編寫,如果只想讓一個IP地址接收資料,則必須指定具體某個IP,這可以用inet_addr()函數,注意,這裡也必須用網路位元組序,調用函數htonl函數
char sin_zero[8];//只是個填充,以保證socketaddr_in與sockaddr長度一樣
}
bind()函數調用成功返回0,失敗就會返回一個SOCKET_ERROR,同樣的錯誤資訊可以通過WSAGetLastError函數返回。
listen(,)
第一個參數為通訊端
第二個參數:等待串連最長請求隊列
在死迴圈裡調用accept(,,) //等待用戶端串連
第一個參數為通訊端
第二個參數為用戶端的IP
第三個參數地址結構的長度,必須有一個初始值,可以用sizeof(SOCKADDR)
返回一個SOCKET
send(,,,)
第一個參數為通訊端(accept傳回值)
第二個參數包含被傳送的資料的buffer
第三個參數buffer資料的長度
第四個參數flag,影響send的行為,設為0
recv(,,,)
第一個參數為通訊端(accept傳回值)
第二個參數包含被接收的資料的buffer
第三個參數buffer資料的長度
第四個參數flag,影響recv的行為,設為0
最後closesocket().
用戶端:
WSAStartup方法調用,建立一個socket,這與伺服器一樣
connect(,,)
第一個參數為通訊端
第二個參數地址結構體資訊,與伺服器端bind函數類似
第三個參數地址結構長度
recv(,,,)
與伺服器端recv函數類似
send()
與伺服器端send函數類似
closesocket
UDP部分
標頭檔Winsock32.h
庫檔案ws2_32.lib
伺服器:
WSAStartup方法調用,建立一個socket,這與TCP伺服器類似(第二個參數改為SOCK_DGRAM)
bind()一樣
recvfrom(,,,,,)
第一個參數為socket
第二個參數buf數組
第三個參數buf的長度
第四個參數flag,設為0,
第五個參數目的地址結構的指標(out)
第六個參數整形的指標,返回地址結構的大小,(in,out)
closesocket()
WSACleanup()
用戶端:
WSAStartup方法調用,建立一個socket
sendto(,,,,)
第一個參數為socket
第二個參數buf數組
第三個參數buf的長度
第四個參數flag,設為0,
第五個參數目的地址結構的指標(out)
第六個參數地址結構體的長度,(in,out)
closesocket()
WSACleanup()