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

How to handle recv() with MSG_DONTWAIT flag for data larger than 64KB on TCP socket?

我想使用 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;
        }
    }

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

您可以更改套接字的缓冲区大小(man 7 套接字,SO_RCVBUF)或使用循环 select 和 recv 以多次读取它进入更大的缓冲区,因为它变得可用。