首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >AF_UNIX套接字中缓冲区的最大长度

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

Stack Overflow用户
提问于 2010-06-16 18:48:18
回答 2查看 7.7K关注 0票数 5

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-06-16 18:58:12

您可以使用setsockopt (SO_SNDBUFSO_RCVBUF)更改每个单独套接字连接的读写缓冲区。

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

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

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

票数 8
EN

Stack Overflow用户

发布于 2010-06-16 19:16:13

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

代码语言:javascript
运行
复制
 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()调用发送所有的数据。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3052587

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档