TCP函数recv()在循环中不起作用

时间:2017-09-06 13:11:10

标签: c linux tcp

我正在使用无限循环来从TCP服务器接收数据 我需要同时执行具有更高优先级的其他任务 但是每次等待TCP数据时,控制都会保持recv()函数。

while(1)
{
        rdlen = read(fd1, buf, (sizeof(buf) - 1));
        if (rdlen > 0) 
        {
            buf[rdlen] = 0;
            printf("%s",buf);
            memset(buf, 0, strlen(buf));
        }
        if((numbytes=recv(sockfd, buf1, wGetLen, 0)) != -1)
        {
            printf("%s %d\n", buf1, numbytes);
            memset(buf1, 0, strlen(buf1));                                
        }
}

如何在不等待TCP接收数据的情况下执行上述操作?

1 个答案:

答案 0 :(得分:2)

您需要将套接字设置为非阻塞套接字。这样做时,如果您调用printf("["); 并且没有任何内容可以接收,则函数调用将返回-1以指示错误,recv为错误代码。

您可以按如下方式设置非阻塞标志

EAGAIN

然后,您可以按如下方式更改int fdflag; if ((fdflag = fcntl(sockfd, F_GETFL)) == -1) { perror("Error getting socket descriptor flags"); exit(1); } fdflag |= O_NONBLOCK; if (fcntl(sockfd, F_SETFL, fdflag) == -1) { perror("Error setting non-blocking option"); exit(1); } 来电:

recv