如何使用MSG_DONTWAIT标志在TCP套接字上处理大于64KB的数据的recv()?

时间:2018-06-21 07:30:09

标签: c sockets tcp-ip recv

我想使用recv的非阻塞API,但是在64KB数据后它不起作用并给出错误:资源暂时不可用。因此,我使用了if(error == EAGAIN),但是由于没有可用数据,它卡在了接收器上。

while(true) {
        ret = recv(csd, buf, size, MSG_DONTWAIT);

        if(errno == EAGAIN) {
            continue;
        }

        if (ret < 0) {
            perror("Error in receive\n");
            close(csd);
            exit(EXIT_FAILURE);
        } else if (ret == 0) {
            fprintf(stderr, "client disconnected\n");
            close(csd);
        } else {
            return buf;
        }
    }

1 个答案:

答案 0 :(得分:1)

默认情况下,套接字内部使用64k缓冲区,然后内核拒绝接受更多数据。因此recv()最多可以返回64kb的数据,而无需等待。

您可以更改套接字(man 7套接字,SO_RCVBUF)的缓冲区大小,或在select和recv周围使用循环,以在可用时将其读入更大的缓冲区中。