玩轉重要的select函數并分析其行為
來源:程序員人生 發布時間:2015-03-04 08:49:08 閱讀次數:7783次
說明: 雖然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"(包括最后的'
主站蜘蛛池模板:
免费国产视频
|
久久久免费精品视频
|
福利视频一二三在线视频免费观看
|
欧美极品少妇xxxxⅹ喷水
|
99青草|
超碰在线网站
|
久久九九久久九九
|
一区二区精
|
97视频在线播放
|
午夜视频网
|
欧美日韩国产色综合视频
|
亚洲午夜久久久
|
h视频网|
精品日产卡一卡二卡麻豆
|
久久久久一区二区
|
av大片|
三级网站
|
久久不射网站
|
一区二区三区视频
|
在线观看免费av网
|
免费亚洲视频
|
婷婷成人基地
|
日韩午夜精品视频
|
国产一区精品
|
裸体在线国模精品偷拍
|
一级肉体全黄裸片
|
精品国产一区二区三区麻豆小说
|
毛片毛片毛片
|
99精品视频免费在线观看
|
99精品国产免费久久
|
国产高清免费视频
|
国产精品久久久久久久午夜
|
在线国产精品视频
|
欧美不卡在线
|
欧美在线观看一区
|
亚洲免费激情
|
国产午夜精品一区二区三区欧美
|
国产精品九九九
|
久久精品免费观看
|
国产超碰人人做人人爽aⅴ
亚州国产
|
成年人免费视频观看
|