1.套接字(Sockets)
套接字分為流套接字和數據報套接字。
流套接字提供雙向有序無重復且無記錄邊界的數據流服務,它適用於處理大量數據。是面向連接的,通信雙方進行數據交換之前,必須建立一條路徑。
數據報套接字支持雙向的數據流,但並不保證傳輸的可靠性有序性和無重復性。數據報套接字是無連接的。
2.Winsock的啟動和終止
Winsock的服務是以動態鏈接庫Winsock DLL形式實現的,所以必須先調用WSAStartup函數對Winsock DLL進行初始化,設定版本號,並分配必要資源。WSAStartup函數原型如下:
int WSAStartup(WORD wVersionRequested,LPWSADATA lpWSAData);
其中wVersionRequested用於指定Winsock庫的版本,通常高位字節指定副版本,低位字節則是主版本。然后用宏MAKEWORD(X,Y)(X為高位字節,Y是低位字節)獲取wVersionRequested的正確值。lpWSAData參數是指向LPSWSADATA結構的指針,該結構包含了加載庫版本有關的信息,它的格式如下:
typedef struct WSAData{
WORD wVersion; //Winsock版本
WORD wHightVersion;
char szDescription[WSADESCRIPTION_LEN+1];
char szSystemStatus[WSASYS_STATUS_LEN+1];
unsigned short iMaxSocket; //打開的套接字的最大長度
unsigned short iMaxUdpDg; //打開的數據報的最大長度
char FAR* lpVendorInfo;
}WSADATA,*LPWSADATA;
其中szDescription和szSystemStatus這兩個字段由特定的Winsock實施方案設定。lpVendorInfo是為Winsock實施方案有關的指定廠商預留的,任何一個Win32平台上都沒使用這個字段。
在應用程序關閉套接字后,還應調用WSACleanup函數終止對Winsock DLL的使用,並釋放資源。
Winsock調用失敗則返回SOCKET_ERROR,並可用WSAGetLastError函數來獲得錯誤代碼。
3.Winsock編程
(1).套接字流
套接字流的服務器進程和客戶端進程在通信前必須創建各自的套接字並建立連接。具體步驟如下:
①.服務器進程創建套接字:服務器進程總是優先於客戶端進程啟動,並調用socket函數創建一個套接字流。socket函數原型如下:
SOCKET socket(int af,int type,int protocol);
其中,參數af用於指定網絡地址類型,一般取AF_INET,表示該套接字在Internet域中進行通信。參數type用於指定套接字類型,SOCK_STREAM表示要創建的實流套接字(TCP),SOCK_DGRAM表示數據部套接字(UDP)。參數protocol用於指定網絡協議,一般取0,表示默認為TCP/IP協議。若套接字創建成功則該函數返回所創建的套接字句柄SOCKET,否則產生INVAILD_SOCKET錯誤。
②.調用bind函數將本地地址綁定到所創建的套接字上以使在網絡上標識該套接字。
int bind(SOCKET s,const struct sockaddr* name,int namelen);
其中,第一個參數s標識一個未綁定套接字的句柄,它用來等待客戶機的連接。第二個參數name是賦予套接字的地址,struct sockaddr結構如下:
struct sockaddr{
u_short sa_family;
u_short sa_family;
char sa_data[14];
};
該地址結構隨所選擇的協議的不同而變化,因此一般情況下另一個與該地址結構大小相同的sockaddr_in結構更為常用,sockaddr_in結構用來標識TCP/IP協議下的地址,可強制將sockaddr_in轉換為sockaddr。sockaddr_in的結構格式如下:
struct sockaddr_in{
short sin_family;
unsigned short sin_port;
struct in_addr sin_addr;
char sin_zero[8];
};
};
③.調用listen函數將套接字置入監聽模式並准備接受連接請求。listen函數

受不了這編輯器了,果然博客只適合做剪切板,寫長文章真蛋疼。我換個地方繼續挖坑。寒假盡力把這個坑填上。