異步套接字

WSADATA wsa;
WSAStartup(MAKEWORD(2,2), &wsa);

SOCKET fdServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);


struct sockaddr_in server;
server.sin_family = AF_INET;
server.sin_addr.s_addr = inet_addr(InternetAddr);
server.sin_port = htons(iPort);
int ret = bind(fdServer, (sockaddr*)&server, sizeof(server));
ret = listen(fdServer, 4);


fd_set fdread;
timeval tv;
int nSize;


while(1)
{
FD_ZERO(&fdread);//初始化fd_set
FD_SET(fdServer, &fdread);//分配套接字句柄到相應的fd_set

tv.tv_sec = 2;//這裏我們打算讓select等待兩秒後返回,避免被鎖死,也避免馬上返回
tv.tv_usec = 0;

select(0, &fdread, NULL, NULL, &tv);
nSize = sizeof(server);
if (FD_ISSET(fdServer, &fdread))//如果套接字句柄還在fd_set裏,說明客戶端已經有connect的請求發過來了,馬上可以accept成功
{
AcceptSocket = accept(fdServer,( sockaddr*) &server, &nSize);
::_beginthread(ClientThread,0,NULL);


}
else//還沒有客戶端的connect請求,我們可以去做別的事,避免像沒有用select方式的阻塞套接字程序被鎖死的情況,如果沒用select,當程序運行到accept的時候客戶端恰好沒有connect請求,那麼程序就會被鎖死,做不了任何事情
{
//do something
printf("%d clients now.Waiting for new comer... \n", gClientCount );



//::MessageBox(NULL, "waiting", "recv", MB_ICONINFORMATION);//別的事做完後,繼續去檢查是否有客戶端連接請求
}


}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章