我正在制作多线程TCP服务器,当我在线程中使用recv()时,它们不会无限更新/执行/运行(looping),除非Recv()实际接收到)一些数据。
这是循环内部的代码段。
if( seconds < 15 ){
printf("%f seconds passed: r", seconds);
if ( (read_size = recv(sock , client_message , 512 , 0)) > 0 )
{
//Send the message back to client
reply_message = client_message;
(void)write(sock, reply_message, strlen(reply_message));
}
}else{
// ... blah blah blah
}
如果我评论内部if语句,则该线程运行&amp;尽可能快地输出printf()。当包含if语句时,线程在recv()上等待,并且不会更新(printf()未打印),直到recv()已收到数据:/
有什么想法吗?
来自recv(2)-linux man page(请参阅此处):
如果插座上没有消息,接收电话等待 除非插座是非封锁(请参阅FCNTL(2)), 在这种情况下,返回值-1和外部变量errno 设置为Eagain或EwoldBlock。接收电话通常返回任何 可用的数据,最多达到请求的金额,而不是等待 收到所请求的全额。
因此,这就是recv
的工作方式。如果您希望它立即返回,则应使用非阻滞模式(请参阅fcntl
和select
DESRIPTIONS)。
// sock is the socket you want to make non-blocking
int status = fcntl(sock, F_SETFL, fcntl(sock, F_GETFL, 0) | O_NONBLOCK);
// handle the error
if(status == -1) {
...
}
如果您想检查是否有插座
的阅读int count = 0;
ioctl(sock, FIONREAD, &count);
count
是套接字中可用的字节数