问题标签 [setsockopt]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
linux - 何时调用 setsockopt?在 bind() 和 connect() 之前?
我继承了一些调用的 TCP 代码:
在致电之前
毫不奇怪,这会导致消息:“地址已在使用中”。只需交换调用顺序即可解决问题。
这就提出了一个问题:一般来说,是否应该在调用 tosetsockopt()
之前进行任何调用bind()
?打电话之前connect()
?
c++ - 设置 QTcpSocket 的 sockopt
我正在创建一个 Linux C++/Qt5 应用程序,它为出站连接(到远程服务器)打开一个 TCP 套接字。我创建了一个 QTcpSocket,然后尝试如下设置 sockopt 选项:
不幸的是,我的 setsockopt 因“错误的文件描述符”错误而失败,因为 m_tcpSocket->socketDescriptor() 返回 -1。如何在连接之前获取出站套接字的套接字描述符?还是我必须在连接后执行此操作?(这似乎与我从 Qt 文档中理解的内容有所不同)
以上适用于侦听套接字(QTcpServer)......只是不是QTcpSocket。
c - 设置接收和发送缓冲区的套接字缓冲区大小
如何在 C 中设置 UNIX 套接字文件描述符的套接字缓冲区大小?我知道 setsockopt 可能是涉及的系统调用......谁能举一个如何使用它的例子,我发现的那个没有解释如何设置缓冲区大小?
python - Python 中的 QDISC_BYPASS(原始套接字)
如何在原始套接字上设置套接字选项以启用 QDISC_BYPASS?我看到了 C 中的示例,但无法清楚地理解如何在 Python 中实现它。我使用 AF_PACKET 和 SOCK_RAW 设置构建了套接字。
我知道我需要使用 socket.setsockopt() 方法,但我不确定在这种情况下如何正确调用它。
c - 由于 setsockopt 中的 SO_BINDTODEVICE 导致的缓存效果
通过SO_BINDTODEVICE
套接字选项,我们可以将套接字设置为网络接口之一 ,如果我们使用两个 NIC 卡并且如果我们想将套接字设置为 NIC 卡之一,那么 SO_BINDTODEVICE 会有所帮助。
如果我们在through中将套接字设置为eth1 ,那么套接字将通过 eth1 接口发送和接收所有数据包。setsockopt
SO_BINDTODEVICE
这是迄今为止我对 SO_BINDTODEVICE 选项的理解,并且有一个关于 SO_BINDTODEVICE 的声明,那就是
您可以多次调用 BINDTODEVICE 来更改套接字绑定的接口,但由于内核中的缓存效应,结果可能无法预测。
那是什么意思,我不明白,这是关于连接的LAN网络的缓存表(路由表),请解释一下
sockets - getsockopt 中的参数级别是什么?
我得到了以下链接:getsockopt() 中的 SOL_SOCKET
但这对我来说真的很困惑。一位回答说,这SOL_SOCKET
意味着套接字层。什么是套接字层?该参数还有其他可用选项吗?
如果我们传递SOL_SOCKET
参数会发生什么?它SOL
代表什么?
我正在使用 UNIX。
c - 为 SO_RCVTIMEO 和 SO_SNDTIMEO 正确使用 getsockopt 和 setsockopt
由于各种原因,我想在服务器中对套接字进行读写超时,但无法使其运行,因此请了解问题可能存在的位置。
为了设置对套接字的读写超时,我尝试使用函数setsocketopt()
和getsocketopt()
. 但是我一定是做错了什么,因为返回值表明发生了问题并且 perror 输出“无效参数”。奇怪的是,错误并不总是在第一次使用setsocketopt()
and时发生getsocketopt()
,这让我有点困惑。
以下服务器和客户端代码重现了我的问题(使用 gcc 编译)
服务器代码:
客户端代码:
在本示例getsockopts()
中,服务器中的第二次调用失败导致perror("3")
被调用。但是,如果我将此行注释掉,以及对第一次调用的最后setsockopts()
一次调用getsockopts()
失败(以前似乎可行)。
任何关于我哪里出错的见解都值得赞赏
sockets - 多次调用 setsockopt
我有使用套接字在两个客户端之间传输数据的应用程序。它使用单个套接字来传递控制和数据流量(通过 UDP)。
IP 标头的 Qos 和 tos 字段可以使用更改
但是(对同一个套接字)的调用setsockopt
次数太多了?例如,假设它将每 1ms 调用一次。
为了缩小问题范围,我问的是现代 linux 系统(一般解释更受欢迎)。
这是一个演示它的示例(这是应用程序的仅发送部分):
笔记:
- 控制和数据都应该共享同一个套接字(同一个 UDP 源端口)。
- 多个线程将使用同一个套接字(因此在 setsockopt 和 sendto 之间需要一些锁定机制;但这超出了问题的范围)。
SO_PRIORITY
只是linux。
c - 有没有办法减少套接字发送缓冲区大小的最小下限?
我正在尝试将默认套接字发送缓冲区大小更改为较小的大小,以查看 UDP 吞吐量如何影响小型 UDP 数据报。为此,我将setsockopt
函数与选项一起使用,SO_SNDBUF
并尝试将缓冲区大小设置为 64 字节。我也getsockopt
用来查看setsockopt
函数的结果。
这是我使用的代码:
但是,我看到的是,每次尝试设置一个较小的值时,缓冲区大小的下限都设置为 4608 字节。以下是上述代码的输出:
- 默认套接字发送缓冲区:212992
- 试图将其更改为:2304
- 新的套接字发送缓冲区:4608
通过尝试各种尺寸,我发现尺寸 <= 2304 会发生这种情况。对于更大的尺寸,例如 2305,我会得到更大的尺寸:
- 默认套接字发送缓冲区:212992
- 试图将其更改为:2305
- 新的套接字发送缓冲区:4610
对于一些更大的尺寸,例如 3000,是我要求的尺寸的两倍:
- 默认套接字发送缓冲区:212992
- 试图将其更改为:3000
- 新的套接字发送缓冲区:6000
通过网上搜索,我发现Linux在设置内核时会将其值加倍,并在查询时返回加倍的值: Understanding set/getsockopt SO_SNDBUF
有没有办法减少套接字发送缓冲区大小的最小下限?例如,将其设置为 64 字节?
linux - 受 SNDBUF 限制的数据报 Unix 域套接字
通过 Unix 数据报域套接字发送 16 字节数据包,SNDBUF 保留在我的 124928 盒子上的默认值(用 验证getsockopt()
)。也max_dgram_qlen
达到了 512。出于测试目的,我的接收器在绑定到 Unix 数据报域套接字后当前正在休眠。
当我启动发件人时,我EAGAIN
在发送 423 个数据包后开始接收错误(我正在发送MSG_DONTWAIT
)。那时我只发送了大约 7k(不包括任何标题),考虑到它的当前设置,填充 SNDBUF 似乎有点早。
为了验证确实是 SNDBUF 限制了发送,我逐渐提高了 SNDBUF 直到它能够击中max_dgram_qlen
(实际上它击中 513)。我必须为此设置的 SNDBUF 值是 75177(由 返回的 151554 getsockopt()
)。
任何想法都将不胜感激,因为感觉好像我在这里遗漏了一些明显的东西。