为什么select()后面非要sleep()不可?

dot99 2004-03-09 07:25:49


代码如下:

NonBlock = 1;
ret = ioctlsocket(sock, FIONBIO, &NonBlock);
checkErr(ret, "ioctlsocket");
for(;;) {
Sleep(50); //非要Sleep(),否则下面ret为0,为什么?
FD_ZERO(&fdread);
FD_SET(sock, &fdread);
ret = select(0, &fdread, 0, 0, &timeout);
checkErr(ret, "select");
if (ret > 0 && FD_ISSET(sock, &fdread)) {
ret = recv(sock, buf, buf_size, 0);
buf[ret] = '\0';
printf("Recieve from server:\n%s\n", buf);
if (strncmp(buf, "end", 3) == 0)
break;
}
FD_ZERO(&fdwrite);
FD_SET(sock, &fdwrite);
ret = select(0, 0, &fdwrite, 0, &timeout);
checkErr(ret, "select");
if (ret > 0 && FD_ISSET(sock, &fdwrite)) {
memset(buf, '\0', buf_size);
printf("cmd/> ");
gets(buf);
ret = send(sock, buf, strlen(buf), 0);
checkErr(ret, "send");
printf("message sent...\n");
}
}


如果不Sleep()的话,要等到下次发送数据后,才能得到上次服务器端传来的消息.
另外select里面的timeval参数到底是什么用?阻塞等待,还是非阻塞?
不管timeval设置为多少,最后,还是要在循环中Sleep(50).

望详细解答


谢谢,
dot99
...全文
109 点赞 收藏 7
写回复
7 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复

还没有回复,快来抢沙发~

发帖
网络编程
创建于2007-09-28

1.8w+

社区成员

VC/MFC 网络编程
申请成为版主
帖子事件
创建了帖子
2004-03-09 07:25
社区公告
暂无公告