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

C AF_UNIX套接字中缓冲区的最大长度,c,sockets,C,Sockets,我想知道:当使用socket(AF_UNIX)用C编程时,在向socket发送或从socket接收数据时是否有任何限制(以字节为单位)?您可以使用(SO_SNDBUF和SO_RCVBUF)更改每个套接字连接的读写缓冲区 默认大小和最大大小取决于平台 此外,如果您为每个单独的读取提供更大的用户端缓冲区,例如使用 如果您按顺序使用几个recvs,您可以在一个连接上读取无限量的字节,这将花费无限长的时间。套接字行为取决于实现。通常,当您发送()时,无法保证有多少字节会被推送到套接字上。由于内核控制这一

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

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

默认大小和最大大小取决于平台

此外,如果您为每个单独的读取提供更大的用户端缓冲区,例如使用


如果您按顺序使用几个
recv
s,您可以在一个连接上读取无限量的字节,这将花费无限长的时间。

套接字行为取决于实现。通常,当您发送()时,无法保证有多少字节会被推送到套接字上。由于内核控制这一点,它可以是任何数字,通常在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;
        }
fcntl(s,F_SETFL,O_NONBLOCK);
int sendall(int s,char*buf,int*len)
{
int total=0;/*我们发送了多少字节*/
int bytesleet=*len;/*我们还有多少要发送*/
int n=0;
int重试次数=0;
结构timespec tp={0500};
而(总计<*len)
{
n=发送(s,buf+总计,字节左,0);
如果(n==-1)
{
/*在这里处理错误,
加上检查是否有阻塞
然后是奈米睡眠()
*/
}
总+=n;
字节左-=n;
}

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

为什么要将其设置为非阻塞,然后在紧循环中对其进行迭代?这似乎是一个矛盾。请注意eWoldBlock注释和timepsec声明。这意味着在阻塞套接字上等待一小段时间。我没有显示它,您是对的,但肯定不是紧循环。我浪费了40行有趣的内容我想把它放在这里。主要是因为它有一些特定于Solaris的套接字代码。在我看来,发布特定于系统的代码是个坏主意,除非作为问题的一部分明确要求发布。嗯,关于a)1500字节,你错了——你假设以太网数据包的大小,但实际上是套接字发送缓冲区,当你调用
send(2)时被填满了
,这在不同的操作系统上是不同的,但通常大于一帧(并且在计算中您忘记了IP和TCP或UDP头);b)非阻塞和nanosleep-您只是在模拟阻塞发送,但在发送缓冲区空间可用时不会让操作系统唤醒您。请删除此代码,在Solaris上使用
/dev/poll
。对于unix域套接字,Sorcvbuf对Linux没有影响。但是Sosndbuf可以用于调整发送缓冲区,但仍然可以使用套接字发送缓冲区由net.core.wmem_max值绑定。