多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > 互聯網 > 玩轉重要的select函數并分析其行為

玩轉重要的select函數并分析其行為

來源:程序員人生   發布時間:2015-03-04 08:49:08 閱讀次數:7777次

       說明:  雖然select函數在Windows和Linux上的用法有些差異, 且這些差異值得我們特別注意, 但從功能上來說, 他們還是差不多的。 本文, 我們僅僅斟酌Windows上的select函數。


      關于select函數的原型和用處, 百度和谷歌的介紹到處都是, 在本文中, 我就不贅述了, 我們僅僅來玩代碼并作扼要分析。 如果有不對或偏頗的地方, 大家可以各抒己見, 共同進步,我也一定會認真核實后給予回應奮斗, 也建議大家多多實踐。



       程序1, 服務端程序:

#include <stdio.h> #include <winsock2.h> // winsock接口 #pragma comment(lib, "ws2_32.lib") // winsock實現 int main() { WORD wVersionRequested; // 雙字節,winsock庫的版本 WSADATA wsaData; // winsock庫版本的相干信息 wVersionRequested = MAKEWORD(1, 1); // 0x0101 即:257 // 加載winsock庫并肯定winsock版本,系統會把數據填入wsaData中 WSAStartup( wVersionRequested, &wsaData ); // AF_INET 表示采取TCP/IP協議族 // SOCK_STREAM 表示采取TCP協議 // 0是通常的默許情況 unsigned int sockSrv = socket(AF_INET, SOCK_STREAM, 0); SOCKADDR_IN addrSrv; addrSrv.sin_family = AF_INET; // TCP/IP協議族 addrSrv.sin_addr.S_un.S_addr = INADDR_ANY; addrSrv.sin_port = htons(8888); // socket對應的端口 // 將socket綁定到某個IP和端口(IP標識主機,端口標識通訊進程) bind(sockSrv,(SOCKADDR*)&addrSrv, sizeof(SOCKADDR)); // 將socket設置為監聽模式,5表示等待連接隊列的最大長度 listen(sockSrv, 5); SOCKADDR_IN addrClient; int len = sizeof(SOCKADDR); unsigned int sockConn = accept(sockSrv,(SOCKADDR*)&addrClient, &len); while(1) { getchar(); char sendBuf[100] = "hello"; send(sockConn, sendBuf, strlen(sendBuf) + 1, 0); // 發送數據到客戶端,最后1個參數1般設置為0 } closesocket(sockConn); closesocket(sockSrv); WSACleanup(); return 0; }


        程序2, 客戶端程序:

#include <winsock2.h> #include <stdio.h> #pragma comment(lib, "ws2_32.lib") int main() { WORD wVersionRequested; WSADATA wsaData; wVersionRequested = MAKEWORD(1, 1); WSAStartup( wVersionRequested, &wsaData ); SOCKET sockClient = socket(AF_INET, SOCK_STREAM, 0); SOCKADDR_IN addrSrv; addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); addrSrv.sin_family = AF_INET; addrSrv.sin_port = htons(8888); int ret = connect(sockClient, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR)); fd_set read_set; struct timeval t; FD_ZERO(&read_set); FD_SET(sockClient, &read_set); t.tv_sec = 20; t.tv_usec = 0; while(1) { ret = select(⑴, &read_set, NULL, NULL, &t); printf("ret is %d ", ret); Sleep(1000); } closesocket(sockClient); WSACleanup(); return 0; }
       我們先開啟服務端程序1, 然后運行客戶端程序2, 然后不要動服務端和客戶端, 靜靜等待, 等20s后, 發現程序2的結果是:

ret is 0
ret is ⑴
ret is ⑴
ret is ⑴
ret is ⑴

...........

       可以看到, 20s后, select函數超時, 返回0. 為何呢? 由于select函數檢測到sockClient對應的內核緩沖區沒有數據可讀, 以超時情勢返回。


       好, 我們重新啟動程序1對應的服務端, 然后重新啟動程序2對應的客戶端, 此時(不用等20s), 我們在服務端上按1下Enter鍵, 向客戶端發送"hello"(包括最后的'

主站蜘蛛池模板: 欧美色欧美色 | 久久影视一区 | 欧美一区二区三区四区在线观看 | 欧美黑人巨大xxxxx | 一级毛片毛片毛片毛毛片 | 一级美国乱色毛片 | 意大利极品xxxxhd | 久久久久嫩草影院精品 | 91精品国产一区二区三区四区 | 国产一区二区三区在线看 | 亚洲成年人在线观看 | 奇米4444| 亚洲第一页在线观看 | 羞羞视频入口网站 | 成人精品国产亚洲 | 欧美激情一级欧美精品 | 欧美视频亚洲 | 国产精品福利在线观看入口 | 欧美干色 | 久久精品视频一区二区三区 | 日本视频中文字幕一区二区 | 国产一区二区精品久久 | 性欧美video另类hd人妖 | 一级一级特黄女人精品毛片视频 | 欧美乱大交xxxx | 欧美一欧美一区二三区性 | 免费h网站在线观看 | 俄罗斯free嫩交hd | 中日韩欧美一级毛片 | avtt亚洲一区中文字幕 | 国产亚洲视频在线观看 | 欧美精品久久久久久久免费观看 | 亚欧美图片自偷自拍另类 | 乌克兰xxxx| 亚洲精品天堂 | 国产精品久久久久国产精品 | 波多野结衣在线免费 | 日韩美一区二区三区 | 日韩精品免费一级视频 | 日本在线一区二区 | 国产一区二区三区免费 |