为什么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