Socket簡介
Socket被稱爲套接字,描述了IP和端口等信息,是一個通信鏈的句柄。
微軟專門開發了一套支持多種網絡協議的網絡編程接口,叫做Winsock,Winsock是Windos SDK的一部分,全稱Windows Sockets API。它對多種協議做了封裝,Socket就是Winsock對TCP協議的封裝。
vc++是微軟開發的一套開發工具,它不僅支持C和C++,還提供一套可視化編程框架MFC。雖然MFC很強大,但是Windos API開發出的程序體積更小、效率更快。
Socket通信流程
Winsock定義了一系列接口用於建立兩臺或多臺機器之間的通信,最常見的是一臺服務器跟多臺客戶機的通信。
服務器創建Socket程序流程
WSAStartup()->socket()->bind()->listen()->accept()->recv/send()->closesocket()
客戶端創建Socket程序流程
WSAStartup()->socket()->connect()->send()/recv()->closesocket()
重點介紹一下bind()函數,這個函數用來給套接字綁定端口和IP信息:
int bind(SOCKET s,const struct sockaddr FAR *name,int namelen);
s:新創建的套接字,後面的提供的IP和端口會綁定它
name:這個結構體保存了IP和端口等信息,定義如下:
struct sockaddr{
u_short sa_family;
char sa_data[14];
}
sockaddr是爲了保持各個特定協議之間的兼容性而設計的,這個結構體再細分就是:
struct sockaddr_in{
short sin_family;
u_short sin_port;
struct in_addr sin_addr;
char sin_zero[8];
}
第三個成員是個in_addr結構體,定義如下:
struct in_addr{
union{
struct{ u_char s_b1,s_b2,s_b3,s_b4;}S_un_b;
struct{ u_short s_w1,s_w2;}S_un_w;
u_long S_addr;
}S_un;
}