问题标签 [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.

0 投票
1 回答
5003 浏览

linux - 何时调用 setsockopt?在 bind() 和 connect() 之前?

我继承了一些调用的 TCP 代码:

在致电之前

毫不奇怪,这会导致消息:“地址已在使用中”。只需交换调用顺序即可解决问题。

这就提出了一个问题:一般来说,是否应该在调用 tosetsockopt()之前进行任何调用bind()?打电话之前connect()

0 投票
1 回答
2141 浏览

c++ - 设置 QTcpSocket 的 sockopt

我正在创建一个 Linux C++/Qt5 应用程序,它为出站连接(到远程服务器)打开一个 TCP 套接字。我创建了一个 QTcpSocket,然后尝试如下设置 sockopt 选项:

不幸的是,我的 setsockopt 因“错误的文件描述符”错误而失败,因为 m_tcpSocket->socketDescriptor() 返回 -1。如何在连接之前获取出站套接字的套接字描述符?还是我必须在连接后执行此操作?(这似乎与我从 Qt 文档中理解的内容有所不同)

以上适用于侦听套接字(QTcpServer)......只是不是QTcpSocket。

0 投票
1 回答
747 浏览

c - 设置接收和发送缓冲区的套接字缓冲区大小

如何在 C 中设置 UNIX 套接字文件描述符的套接字缓冲区大小?我知道 setsockopt 可能是涉及的系统调用......谁能举一个如何使用它的例子,我发现的那个没有解释如何设置缓冲区大小?

0 投票
1 回答
144 浏览

python - Python 中的 QDISC_BYPASS(原始套接字)

如何在原始套接字上设置套接字选项以启用 QDISC_BYPASS?我看到了 C 中的示例,但无法清楚地理解如何在 Python 中实现它。我使用 AF_PACKET 和 SOCK_RAW 设置构建了套接字。

我知道我需要使用 socket.setsockopt() 方法,但我不确定在这种情况下如何正确调用它。

0 投票
0 回答
150 浏览

c - 由于 setsockopt 中的 SO_BINDTODEVICE 导致的缓存效果

通过SO_BINDTODEVICE套接字选项,我们可以将套接字设置为网络接口之一 ,如果我们使用两个 NIC 卡并且如果我们想将套接字设置为 NIC 卡之一,那么 SO_BINDTODEVICE 会有所帮助。

如果我们在through中将套接字设置为eth1 ,那么套接字将通过 eth1 接口发送和接收所有数据包。setsockoptSO_BINDTODEVICE

这是迄今为止我对 SO_BINDTODEVICE 选项的理解,并且有一个关于 SO_BINDTODEVICE 的声明,那就是

可以多次调用 BINDTODEVICE 来更改套接字绑定的接口,但由于内核中的缓存效应,结果可能无法预测。

那是什么意思,我不明白,这是关于连接的LAN网络的缓存表(路由表),请解释一下

0 投票
1 回答
2278 浏览

sockets - getsockopt 中的参数级别是什么?

我得到了以下链接:getsockopt() 中的 SOL_SOCKET

但这对我来说真的很困惑。一位回答说,这SOL_SOCKET意味着套接字层。什么是套接字层?该参数还有其他可用选项吗?

如果我们传递SOL_SOCKET参数会发生什么?它SOL代表什么?

我正在使用 UNIX。

0 投票
2 回答
26596 浏览

c - 为 SO_RCVTIMEO 和 SO_SNDTIMEO 正确使用 getsockopt 和 setsockopt

由于各种原因,我想在服务器中对套接字进行读写超时,但无法使其运行,因此请了解问题可能存在的位置。

为了设置对套接字的读写超时,我尝试使用函数setsocketopt()getsocketopt(). 但是我一定是做错了什么,因为返回值表明发生了问题并且 perror 输出“无效参数”。奇怪的是,错误并不总是在第一次使用setsocketopt()and时发生getsocketopt(),这让我有点困惑。

以下服务器和客户端代码重现了我的问题(使用 gcc 编译)

服务器代码:

客户端代码:

在本示例getsockopts()中,服务器中的第二次调用失败导致perror("3")被调用。但是,如果我将此行注释掉,以及对第一次调用的最后setsockopts()一次调用getsockopts()失败(以前似乎可行)。

任何关于我哪里出错的见解都值得赞赏

0 投票
0 回答
1230 浏览

sockets - 多次调用 setsockopt

我有使用套接字在两个客户端之间传输数据的应用程序。它使用单个套接字来传递控制和数据流量(通过 UDP)。

IP 标头的 Qos 和 tos 字段可以使用更改

但是(对同一个套接字)的调用setsockopt次数太多了?例如,假设它将每 1ms 调用一次。

为了缩小问题范围,我问的是现代 linux 系统(一般解释更受欢迎)。

这是一个演示它的示例(这是应用程序的仅发送部分):

笔记:

  • 控制和数据都应该共享同一个套接字(同一个 UDP 源端口)。
  • 多个线程将使用同一个套接字(因此在 setsockopt 和 sendto 之间需要一些锁定机制;但这超出了问题的范围)。
  • SO_PRIORITY只是linux。
0 投票
1 回答
1811 浏览

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 字节?

0 投票
0 回答
346 浏览

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())。

任何想法都将不胜感激,因为感觉好像我在这里遗漏了一些明显的东西。