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

标签 c sockets tcp 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;
        }
    }

最佳答案

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

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

关于c - 对于 TCP 套接字上大于 64KB 的数据,如何使用 MSG_DONTWAIT 标志处理 recv()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50962793/

相关文章:

java - 在 Java 中,如何从已打开的 C 套接字的文件描述符中获取 Socket 或 DatagramSocket?

c - 如何使用 c 中的套接字 api 一次性发送 .bmp 文件?

linux - 转储和丢弃特定应用程序的网络数据包的最佳方法是什么?

sql-server - 与蜂窝调制解调器的 TCP 连接?

c - 如何更改 OpenSSL 配置文件的位置

c++ - 如何最好地防止库(源)和应用程序(头文件)编译之间的(编译器)标志不匹配?

c - 使用算术索引数组而不是显式/单个值会导致问题吗?

c - 在 C 中使用 socket_stream 传输 jpg 文件

Java Socket BufferedReader

c - 如何获取字符分隔的子字符串?