玩轉重要的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|
亚洲精品天堂
|
国产精品久久久久国产精品
|
波多野结衣在线免费
|
日韩美一区二区三区
|
日韩精品免费一级视频
|
日本在线一区二区
|
国产一区二区三区免费
|