首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >套接字选项SO_SNDLOWAT的用途是什么

套接字选项SO_SNDLOWAT的用途是什么
EN

Stack Overflow用户
提问于 2011-11-23 16:46:37
回答 3查看 8.9K关注 0票数 8

我目前正在将C中的一个软件从Tru64移植到Linux 11。在Tru64上,他们将SO_SNDLOWAT套接字选项的值设置为1024 * 64。在Linux上,此选项不可更改,其值为1。

我想弄清楚,在Linux上不将SO_SNDLOWAT设置为1024 * 64会对软件执行产生什么影响。

问题是我找到了两个关于SO_SNDLOWAT目的的定义(解释)

在Linux上的套接字手册页上找到了

SO_SNDLOWAT

指定缓冲区中的最小字节数,直到套接字层将数据传递给协议为止。

我的理解是,它指定缓冲区中要进行的最小字节数(在本例中用于发送消息)。至少需要填充缓冲区才能继续执行SO_SNDLOWAT字节。

  1. 在“:W.RichardStevens,Bill,AndrewM.Rudoff的套接字网络API”一书中找到

发送低水标记是在套接字发送缓冲区中必须存在的可用空间的数量,以便选择返回“可写”。。

我理解,如果我想在套接字缓冲区中写入(不管我正在写的东西有多大),缓冲区至少需要释放SO_SNDLOWAT字节。

我不知道如何看待SO_SNDLOWAT

EN

回答 3

Stack Overflow用户

发布于 2017-07-14 14:40:23

正如您可以看到的at this question (它涵盖了其他套接字选项),答案取决于操作系统,因此这两个答案都可能是正确的,因为一个是来自Linux的答案,一个是来自UNIX (BSD和Co)世界的答案。

在BSD和BSD克隆中,此选项意味着:

  1. 如果套接字是无阻塞的,并且您调用send(),那么它必须能够一次接受所有提供的数据,或者至少能够接受SO_SNDLOWAT字节的数据;如果这是不可能的,它将不会接受任何数据,send()也会出错。

因此,如果您将SO_SNDLOWAT设置为100并尝试发送50个字节,它将发送50个字节或不发送。如果您将SO_SNDLOWAT设置为100并尝试发送200个字节,它必须至少接受100个字节的数据,它可以接受更多的数据,最多可以接受整个200个字节,以及100到200之间的任何值,只是不少于100。请记住,SO_SNDLOWAT的默认值是1,这也是非阻塞套接字的默认行为(它必须至少接受1字节或EWOULDBLOCK失败)

请注意,UDP套接字始终是全部或无,它们从不只接受“数据的一部分”,因此设置SO_SNDLOWAT只与TCP套接字相关,这可能只接受部分提供的数据。

  • ,如果套接字阻塞,则设置SO_SNDLOWATsend()调用没有实际影响,在这种情况下,套接字将始终接受所有数据或阻塞,然后它将阻塞直到所有数据被接受或发送超时被击中(如果使用SO_SNDTIMEO设置了发送超时,或者如果套接字是否阻塞,则底层协议对SO_SNDTIMEO有自己的超时),无论它是UDP还是TCP,poll()select()调用都只能声明该套接字是可写的,如果至少SO_SNDLOWAT字节可以被send()调用接受。

那么,这个选择到底有什么好处呢?通常,它用于避免进程在套接字缓冲区运行满后按字节逐字节地输入数据,但在默认情况下,select()poll()会说套接字是可写的,即使套接字缓冲区中只有一个字节的空间。换句话说,这只是一种性能优化,因为无论SO_SNDLOWAT被设置为哪个值,任意套接字写入正确工作的代码在某些极端情况下可能只需要更少的CPU时间(如果SO_SNDLOWAT有一个合理的值)。但是和所有的性能调整一样,如果您不知道自己在做什么,那么设置错误的值很容易使事情变得更糟,所以如果有疑问,就不要碰那个设置。

票数 3
EN

Stack Overflow用户

发布于 2011-11-23 17:36:02

第一种描述是正确的解释。

至于不能设置SO_SNDLOWAT的影响,我认为这并不重要,因为性能取决于Nagle的算法、路径-MTU发现等。我怀疑其他TCP/IP实现会忽略这个选项。

票数 1
EN

Stack Overflow用户

发布于 2011-11-23 22:53:37

Afaik第二个是正确的,但我从来不能使用它。

SO_SNDLOWAT在Linux上是不可改变的。setsockopt与错误ENOPROTOOPT

一起失败

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

https://stackoverflow.com/questions/8245937

复制
相关文章

相似问题

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