C-线程不更新,而是在RECV()上阻止



我正在制作多线程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的工作方式。如果您希望它立即返回,则应使用非阻滞模式(请参阅fcntlselect 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是套接字中可用的字节数

最新更新