網路程式設計第一章總結(下)

i_actor發表於2020-12-05

1.3、基於windows平臺的實現

1.3.1、配置環境

在使用windows進行socket網路程式設計之前,需要先配置所需要的ws2_32.lib。
配置:屬性 -> 配置屬性 -> 輸入 -> 附加依賴項中新增ws2_32.lib

1.3.2、Winsock初始化

在Winsock程式設計時,首先需要呼叫WASAtartup函式來設定Winsock版本,並初始化相應的庫。

int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData);

wVersopmRequested:指需要用到的Winsock版本資訊。lpWSAData:WSADATA結構體變數的地址值。WODR是typedef宣告定義的unsigned short型別(若版本為1.2,則1表示主版本號,2表示副版本號,應傳遞0x0201,使用2.2版本應傳遞0x0202)
exam:

int main(void)
{
	WSADATA wsaData;
	if(WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
		ErrorHandling("WSAStartup() error!");
	return 0;
}

1.3.3、登出Winsock

int WSACleanup(void);

成功返回0,失敗則返回SOCKET_ERROR。一般在程式結束之前呼叫。

1.4、基於windows的套接字相關函式

1.4.1、建立套接字

SOCKET socket(int af, int type, int protocal);

成功返回套接字控制程式碼,失敗則返回INVALID_SOCKET。

1.4.2、繫結套接字

bind函式在windows和linux中相同

int bind(SOCKET s, const struct sockaddr * name, int namelen);

成功返回0,失敗則返回SOCKET_ERROR。

1.4.3、監聽套接字

listen函式在windows和linux中相同。

int listen(SOCKET s, int backlog);

成功返回0,失敗返回SOCKET_ERROR。

1.4.4、接受請求

accept在windows和linux中相同。

SOCKET accept(SOCKET s, struct sockaddr * addr, int * addrlen);

成功返回控制程式碼,失敗返回INVALID_SOCKET。

1.4.5、傳送連線請求

connect在windows和linux下相同。

int connect(SOCKET s, const struct sockaddr * name, int namelen);

成功返回0,失敗返回SOCKET_ERROR。

1.4.6 關閉socket

在windows下需要自己關閉socket連線,需要用到closesocket函式。

int closesocket(SOCKET s);

成功返回0,失敗返回SOCKET_ERROR。

1.5、windows下資料傳輸

linux中將套接字也當作檔案,所以無論是建立檔案還是套接字都是返回檔案描述符。而在windows中則需要區分檔案控制程式碼和socket控制程式碼。由於linux中套接字也是檔案,所以可以直接通過檔案I/O函式read和write來進行資料傳輸,而windows中則不同,windows中嚴格區分檔案I/O和套接字I/O。所以windows進行資料傳輸需要用到send和recv函式。

1.5.1、資料傳輸函式

使用send函式進行資料的傳輸。

int send(SOCKET s, const char *buf, int len, int flags);

成功返回傳輸字計數,失敗返回SOCKET_ERROR。
s:控制程式碼;buf:保持待傳輸資料的緩衝地址值;len:要傳輸的位元組數;flags:傳輸資料時用到的多種選項資訊。

1.5.2 接收資料

使用recv函式接受資料。

int recv(SOCKET s, const char * buf, int len, int flags);

成功返回接收的位元組數,如果到eof返回0,失敗返回SOCKET_ERROR。
s:套接字;buf:資料緩衝;len:最大位元組數;flags:接受多種選項資訊。

相關文章