问题标签 [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.
java - 如何在 Java 中调用 getsockopt 以获取 SO_ORIGINAL_DST
有谁知道是否有一个现有的库可以让我调用 getsockopt 以获取 iptables 通过我的 Java 应用程序重新路由的套接字的目标 IP?
这是 Netty 邮件列表上的一个类似问题,但没有得到答复。
c 中的调用看起来像:
也欢迎使用 JNI 执行此操作的示例。
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 地址是正确的:
我真的很难过。
c - getsockopt 返回与 setsockopt 中的一组不同的 IP_TOS 值
我正在尝试使用setsockopt
将IPTOS
值设置为IPTOS_THROUGHPUT
. setsockopt
电话回来了0
。但是,getsockopt
显示IP_TOS
值设置为1
,与IPTOS_THROUGHPUT
( 0x8
) 不同。有谁知道是什么导致了and的IPTOS
价值不匹配?setsockopt
getsockopt
这是日志输出:
在套接字 26 上设置 DSCP 标记
套接字 26 到 8 上的 setsockopt 返回 0
插座 26 上的 DSCP 标记为 1,与预期的 8 不同
下面是代码:
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()
不同。但是我收到的字节有时超过了分配。
c - SO_ERROR 与 errno
对于获取套接字系统调用(如recv
)错误,哪个更好(在性能级别)?
- 使用普通的旧
errno
- 或
SO_ERROR
用作getsockopt()
optname ?
我认为errno
(__error()
在我的系统上定义)更快,因为它不是系统调用。我对吗 ?
SO_ERROR 的优点是:获取后自动错误重置,并且我们确信错误只与我们的套接字有关。它更安全。
你觉得哪一个更好?两者之间真的存在性能差异吗?
linux - 做一组后getsockopt SO_RECVBUF在linux中显示两倍的值?
当使用 SO_RECVBUF 调用 setsockopt,然后转身使用 SO_RECVBUF 调用 getsockopt 时,它似乎告诉我它将缓冲区大小设置为我请求设置的两倍。有人知道为什么会这样吗?
有问题的代码:
https://gist.github.com/rdp/8443238
输出:
仅在 linux 中,在其他操作系统上似乎将其报告为我设置的值。谢谢你。
c++ - 获取 IPPROTO_SCTP、SCTP_STATUS 的“无效参数”
设想:
我创建了 SCTP 一对多套接字(以大写字母开头的函数调用相应的标准函数并检查错误并将 errno 打印到 stderr)
然后我阻止对 sctp_recvmsg 的调用以在消息到达时读取消息
在客户端连接后,我调用getsockopt来检索 SCTP 关联的当前状态
函数 sctp_address_to_associd 是:
为什么getsockopt返回“无效参数”?errno = 22。操作系统是 Linux Ubuntu 12.10。
c - OS X getsockopt:没有 SO_PROTOCOL
OS X 不提供SO_PROTOCOL
允许调用者“...以整数形式检索套接字类型”的套接字选项。(http://linux.die.net/man/7/socket)
换句话说,以下程序在 linux 下构建并运行,但在 OS X 下无法编译:
如何在 OS X 下做到这一点?
c - UDP 的类似 TCP_INFO 的统计信息
我正在使用 Linux 内核 2.6.32 (x86_64),并且可以通过传递和接收一个结构TCP_INFO
来获取 TCP 统计信息,该结构在.getsockopt
tcp_info
/usr/include/netinet/tcp.h
我可以获得类似的 UDP 统计数据吗?(可能更少,因为没有内置的拥塞控制和重传等,但我对我能得到的任何统计数据都很满意)
c++ - 在 C++ 中套接字的发送缓冲区为空之前,我应该等多久?
我试图限制我只有一个接收器的网络。
首先,我通过以下方式检测 SO_SNDBUF 的大小:
然后,我不断填充这个缓冲区,直到它完全填满:
当然,我只提到我的代码的相关部分。
最后,当缓冲区已满时,写入套接字。
我的问题还没有提到。在我想再次重新发送数据之前,上述所有内容都运行良好。
现在,因为我想以最大可能的速率发送,所以我必须尽可能少地等待。(即我必须立即重新发送发送缓冲区为空)。
如何检测write()
重新清空发送缓冲区所需的时间(以最佳方式)?
PS请不要告诉我等待任意时间(例如usleep(10000);
)