问题标签 [getsockopt]

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 投票
2 回答
886 浏览

java - 如何在 Java 中调用 getsockopt 以获取 SO_ORIGINAL_DST

有谁知道是否有一个现有的库可以让我调用 getsockopt 以获取 iptables 通过我的 Java 应用程序重新路由的套接字的目标 IP?

这是 Netty 邮件列表上的一个类似问题,但没有得到答复。

c 中的调用看起来像:

也欢迎使用 JNI 执行此操作的示例。

0 投票
1 回答
5119 浏览

c++ - getsockopt(...,SO_ORIGINAL_DST,...) 偶尔返回客户端地址

我正在开发一个接受 HTTP 请求并将它们转发到目的地的项目。我们使用 Linux (2.6.35.14-106.fc14.x86_64) 和 TPROXY。我将在下面详细介绍。

我看到的问题是偶尔(1000 次中有 1 次,有时 100 万次中有 1 次),Linux 正在返回对等地址作为目标地址。

有没有人看到这种情况发生?我在网上看到了 2007 年的一篇笔记,所以我认为这可能有点过时了。

我有以下代码(请原谅此处显示的方法不一致):

发生的情况是大多数时候 getpeername 和 getsockopt 报告正确(请参阅下面的 IPTABLE 配置)。

不幸的是,偶尔getsockopt 报告与getpeername 相同,即目的地与peer 相同。

IPTABLE 配置:

我们已经记录了活动,它看起来不错。例如,我们得到以下输出:

然而,来自 IPTables 的日志显示 IP 地址是正确的:

我真的很难过。

0 投票
1 回答
5396 浏览

c - getsockopt 返回与 setsockopt 中的一组不同的 IP_TOS 值

我正在尝试使用setsockoptIPTOS值设置为IPTOS_THROUGHPUT. setsockopt电话回来了0。但是,getsockopt显示IP_TOS值设置为1,与IPTOS_THROUGHPUT( 0x8) 不同。有谁知道是什么导致了and的IPTOS价值不匹配?setsockoptgetsockopt

这是日志输出:

在套接字 26 上设置 DSCP 标记

套接字 26 到 8 上的 setsockopt 返回 0

插座 26 上的 DSCP 标记为 1,与预期的 8 不同

下面是代码:

0 投票
1 回答
624 浏览

linux - recv() 函数可以接收比其内部缓冲区更多的字节吗?

我是 Linux 中套接字的新手,并试图了解其recv()工作原理。尝试了一个我无法清楚地找到解释的场景。我希望那里有人可以启发我。这是场景:

使用 TCP 套接字在两个进程(发送方和接收方)之间发送 5 MiB 的数据。我在运行 Linux 的 i.MX6 Sabrelite 板上执行这些过程。

发件人.cpp:

接收器.cpp:

getsockopt()在接收之前使用函数调用来获取内部缓冲区SO_RCVBUF大小。大约是 86 KiB。

我想看看获得 5 MiB 需要多少次调用以及每次调用recv()需要多少字节。recv()

收到 5 MiB 后,我检查输出。几乎需要 48 次recv()调用才能获得 5 MiB 的数据。对于前 40 次调用,它收到的数据少于 86 KiB,这是有道理的,因为收到的字节数小于内部缓冲区。如果我收到了 86 KiB 的两倍,那么我遇到的一些解释是内核通常分配SO_RCVBUF.

但我收到的字节数超过了 86 KiB 的两倍。

我可以相信SO_RCVBUF使用的尺寸getsockopt()吗?

它会动态改变它的值吗?

刚刚尝试了相同场景的另一个迭代。通话次数recv()不同。但是我收到的字节有时超过了分配。

0 投票
2 回答
15264 浏览

c - SO_ERROR 与 errno

对于获取套接字系统调用(如recv)错误,哪个更好(在性能级别)?

  • 使用普通的旧errno
  • SO_ERROR用作getsockopt()optname ?

我认为errno__error()在我的系统上定义)更快,因为它不是系统调用。我对吗 ?

SO_ERROR 的优点是:获取后自动错误重置,并且我们确信错误只与我们的套接字有关。它更安全。

你觉得哪一个更好?两者之间真的存在性能差异吗?

0 投票
2 回答
1593 浏览

linux - 做一组后getsockopt SO_RECVBUF在linux中显示两倍的值?

当使用 SO_RECVBUF 调用 setsockopt,然后转身使用 SO_RECVBUF 调用 getsockopt 时,它似乎告诉我它将缓冲区大小设置为我请求设置的两倍。有人知道为什么会这样吗?

有问题的代码:

https://gist.github.com/rdp/8443238

输出:

仅在 linux 中,在其他操作系统上似乎将其报告为我设置的值。谢谢你。

0 投票
1 回答
2899 浏览

c++ - 获取 IPPROTO_SCTP、SCTP_STATUS 的“无效参数”

设想:

我创建了 SCTP 一对多套接字(以大写字母开头的函数调用相应的标准函数并检查错误并将 errno 打印到 stderr)

然后我阻止对 sctp_recvmsg 的调用以在消息到达时读取消息

在客户端连接后,我调用getsockopt来检索 SCTP 关联的当前状态

函数 sctp_address_to_associd 是:

为什么getsockopt返回“无效参数”?errno = 22。操作系统是 Linux Ubuntu 12.10。

0 投票
1 回答
1250 浏览

c - OS X getsockopt:没有 SO_PROTOCOL

OS X 不提供SO_PROTOCOL允许调用者“...以整数形式检索套接字类型”的套接字选项。(http://linux.die.net/man/7/socket

换句话说,以下程序在 linux 下构建并运行,但在 OS X 下无法编译:

如何在 OS X 下做到这一点?

0 投票
1 回答
826 浏览

c - UDP 的类似 TCP_INFO 的统计信息

我正在使用 Linux 内核 2.6.32 (x86_64),并且可以通过传递和接收一个结构TCP_INFO来获取 TCP 统计信息,该结构在.getsockopttcp_info/usr/include/netinet/tcp.h

我可以获得类似的 UDP 统计数据吗?(可能更少,因为没有内置的拥塞控制和重传等,但我对我能得到的任何统计数据都很满意)

0 投票
1 回答
790 浏览

c++ - 在 C++ 中套接字的发送缓冲区为空之前,我应该等多久?

我试图限制我只有一个接收器的网络。

首先,我通过以下方式检测 SO_SNDBUF 的大小:

然后,我不断填充这个缓冲区,直到它完全填满:

当然,我只提到我的代码的相关部分。

最后,当缓冲区已满时,写入套接字。

我的问题还没有提到。在我想再次重新发送数据之前,上述所有内容都运行良好。

现在,因为我想以最大可能的速率发送,所以我必须尽可能少地等待。(即我必须立即重新发送发送缓冲区为空)。

如何检测write()重新清空发送缓冲区所需的时间(以最佳方式)?

PS请不要告诉我等待任意时间(例如usleep(10000);