AF_UNIX套接字中的最大缓冲区长度

时间:2010-06-16 10:48:18

标签: c sockets

我想知道:当使用套接字(AF_UNIX)在C中编程时,在发送或接收套接字时是否有任何限制(以字节为单位)?

2 个答案:

答案 0 :(得分:6)

您可以使用setsockoptSO_SNDBUFSO_RCVBUF)更改每个套接字连接的读写缓冲区。

默认和最大尺寸取决于平台。

此外,如果您为每个阅读提供更大的用户端缓冲区,例如与recv

如果你按顺序使用多个recv,你可以通过一个连接读取无限量的字节,它只需要很长的时间。

答案 1 :(得分:0)

套接字行为是依赖于实现的。通常,当您发送()时,无法保证将多少字节推送到套接字上。由于内核控制它,它可以是任何数字,通常在1500或更小的范围内。因此,您需要做的是检查send()返回代码并继续将数据推送到套接字上,直到完成为止。此示例假定您已使用以下命令将套接字设置为非阻塞:

 fcntl(s, F_SETFL, O_NONBLOCK);


int sendall(int s, char *buf, int *len)
{
        int total = 0;        /* how many bytes we've sent */
        int bytesleft = *len; /* how many we have left to send */
        int n=0;
        int retries=0;
        struct timespec tp={0,500};

        while(total < *len) 
        {
                n = send(s, buf+total, bytesleft, 0);
                if (n == -1)
                {
                   /* handle errors here, 
                      plus check for EWOULDBLOCK 
                      and then nanosleep()
                   */
                }
                total += n;
                bytesleft -= n;
        }

要回答您的问题 - 没有限制,您只能通过一次send()调用发送所有数据。