資源描述:
《winsock api 選項(xiàng)配置》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫(kù)。
1、WinsockAPI選項(xiàng)配置摘要 介紹了icrosoft聯(lián)合了其他幾家公司共同制定了一套,當(dāng)套接字為數(shù)據(jù)報(bào)類型時(shí),type應(yīng)設(shè)置為SOCK_DGRAM,如果是可以直接訪問(wèn)IP協(xié)議的原始套接字則type應(yīng)設(shè)置為SOCK_RAily;/*addresstype*/charsa_data[14];/*protocoladdress*/}其中sa_family意指套接字使用的協(xié)議族地址類型,對(duì)于一般的TCP/IP網(wǎng)絡(luò),其值應(yīng)該是AF_I,sa_data是存儲(chǔ)地址協(xié)議信息的數(shù)組,不同的協(xié)議族有不同的地址,但是都可以存在這個(gè)通用的結(jié)構(gòu)體里面,通常的做法是將不同的協(xié)議轉(zhuǎn)換成相同
2、的協(xié)議地址,然后再進(jìn)行通訊。用于TCP/IP協(xié)議族的套接字地址結(jié)構(gòu)是sockaddr_in,其定義為:structsockaddr_in{shortsin_family;unsignedshortsin_port;IN_ADDRsin_addr;charsin_zero[8];};其中sin_zero成員并未使用,它是為了和通用套接字地址structsockaddr兼容性而設(shè)定的。在編程中,一般都通過(guò)bzero()或是memset()將其置零。servaddr.sin_family=AF_I;表示套接字使用TCP/IP協(xié)議族。servaddr.sin_addr.s
3、_addr=htonl(INADDR_ANY);設(shè)置服務(wù)器套接字的IP地址為特殊值INADDR_ANY,表示服務(wù)器愿意接收來(lái)自任何網(wǎng)絡(luò)設(shè)備接口的客戶機(jī)連接。htonl()函數(shù)將主機(jī)順序的字節(jié)轉(zhuǎn)換成網(wǎng)絡(luò)順序的字節(jié)。servaddr.sin_port=htons(PORT);設(shè)置通信端口號(hào),PORT即用于通訊的端口號(hào)。3.2bind()將一本地地址與一套接字捆綁。intbind(SOCKETs,conststructsockaddr*name,intnamelen);s:未綁定的套接字。name:套接字地址。sockaddr結(jié)構(gòu)定義如下:structsockaddr{
4、u_shortsa_family;charsa_data[14];};namelen:name名字的長(zhǎng)度。本函數(shù)適用于未連接的數(shù)據(jù)報(bào)或流類套接字,在listen()調(diào)用前使用。當(dāng)用socket()創(chuàng)建套接字后,它便存在于一個(gè)名字空間(地址族)中,但并未賦名。bind()函數(shù)通過(guò)給一個(gè)未命名套接字分配一個(gè)本地名字來(lái)為套接字建立本地捆綁。如果端口號(hào)置為0,則e()來(lái)獲知所分配的地址,但getsockname()只有在套接字連接成功后才會(huì)正確的得到分配的地址。3.3listen()intlisten(intsockfd,intbacklog);參數(shù)sockfd指定要求轉(zhuǎn)
5、換的套接字描述符,參數(shù)backlog設(shè)置請(qǐng)求隊(duì)列的最大長(zhǎng)度。函數(shù)listen()主要完成以下操作: 首先是將套接字轉(zhuǎn)換成監(jiān)聽(tīng)套接字??蛻魴C(jī)可以通過(guò)調(diào)用函數(shù)connect()來(lái)使用這樣的套接字主動(dòng)和服務(wù)器建立連接。而listen()可將一個(gè)服務(wù)端尚未連接的主動(dòng)套接字轉(zhuǎn)換成為這樣的"被動(dòng)"套接字,也就是監(jiān)聽(tīng)套接字。在執(zhí)行了listen()函數(shù)之后,服務(wù)器的TCP就由CLOSED變成LISTEN狀態(tài)了。另外listen()可以設(shè)置連接請(qǐng)求隊(duì)列的最大長(zhǎng)度。TCP協(xié)議為每個(gè)傾聽(tīng)套接字實(shí)際上維護(hù)兩個(gè)隊(duì)列,一個(gè)是未完成連接隊(duì)列,這個(gè)隊(duì)列中的成員都是未完成3次握手的連接;另一個(gè)
6、是完成連接隊(duì)列,這個(gè)隊(duì)列中的成員都是雖然已經(jīng)完成了3次握手,但是它是還未被服務(wù)器調(diào)用accept()接收的連接。參數(shù)backlog指定的是這個(gè)傾聽(tīng)套接字完成連接隊(duì)列的最大長(zhǎng)度。3.4accept()intaccept(intsockfd,structsockaddr*addr,int*addrlen);參數(shù)sockfd是轉(zhuǎn)換成功并且得到的傾聽(tīng)套接字;參數(shù)addr是一個(gè)指向套接字地址結(jié)構(gòu)的指針,參數(shù)addrlen為一個(gè)整型指針。當(dāng)函數(shù)成功執(zhí)行時(shí),返回3個(gè)結(jié)果,函數(shù)返回一個(gè)新的套接字,即接收套接字,服務(wù)器可以通過(guò)這個(gè)新的套接字描述符和客戶機(jī)進(jìn)行通信。參數(shù)addr所指向
7、的套接字地址結(jié)構(gòu)中將存放客戶機(jī)的相關(guān)信息,addrlen指針將描述前述套接字地址結(jié)構(gòu)的長(zhǎng)度。在通常情況下程序服務(wù)端對(duì)后面兩個(gè)參數(shù)信息不是很感興趣,我們可以忽略他們,因此通常我們將accept()函數(shù)的后兩個(gè)參數(shù)都設(shè)置為NULL。3.5connect()intconnect(intsockfd,structsockaddr*servaddr,intaddrlen);參數(shù)sockfd是調(diào)用函數(shù)socket()返回的套接字描述符,參數(shù)servaddr指向遠(yuǎn)程服務(wù)器的套接字地址結(jié)構(gòu),參數(shù)addrlen指定這個(gè)套接字地址結(jié)構(gòu)的長(zhǎng)度。函數(shù)connect()執(zhí)行成功時(shí)返回"0"
8、,如果執(zhí)行