问题标签 [raw-sockets]

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 回答
14325 浏览

c - 使用 setsockopt() 系统进行设备绑定的原始套接字在 Fedora 核心 6(2.6.18-1.2798.fc6) 中不起作用

请任何人都可以帮助解决这个问题。请

在下面的示例代码中,我们将 raw sock 与 eth0 绑定。但是在运行程序时,原始袜子的 recvfrom 正在同一台机器(xx_86)上接收来自 eth0 和 eth1 的数据包。我不清楚为什么,可以帮助解决这个问题。我希望 setsockopt 不能正常工作 操作系统:Fedora core 6(2.6.18-1.2798.fc6)

示例代码:

0 投票
2 回答
1157 浏览

linux - TCP:从服务器端模拟 EINPROGRESS (linux)

如何模拟来自非阻塞客户端的连接以遇到 EINPROGRESS 错误?我可以从服务器做些什么来将此类错误返回给客户端(即调整一些 tcp 计时器、原始套接字服务器等。)

0 投票
2 回答
1577 浏览

c - 如何从原始套接字获取 IP src 地址

我想通过原始套接字发送 TCP 数据包,然后我被 tcp 标头的校验和字段卡住了。由于我不知道如何计算原始套接字使用的实际 IP 地址,因此似乎不可能构造 TCP 伪标头以进行校验和计算。

0 投票
2 回答
1224 浏览

c# - 为什么我不能发送这个 IP 数据包?

我正在尝试使用 c# 发送 IP 数据包。

builtPacket 的内容如下所示。它是一个包含 TCP SYN 数据包的 IP 数据包(这就是我认为我创建的)。

45 00 00 28 00 00 00 00 02 06 36 6E C0 A8 00 8C

C0 A8 00 C6 14 1E 00 50 00 00 00 00 00 00 00 00

05 02 FF FF E6 4F 00 00

输出是:

问题是我在 Wireshark 跟踪中看不到任何内容。就像数据在堆栈中的距离不够远,Wireshark 无法看到它?如果我使用浏览器连接到 192.168.0.198,Wireshark 会显示所有数据包,但当我尝试使用上述代码和数据发送数据包时,什么也不显示。

我的配置:

  • 我以管理员身份运行,所以这不是权限问题。

  • Windows7(不在虚拟机中运行)

  • Wireless connection only (IP config reports its IP as 192.168.0.140)

What am I doing wrong?

I'm sure Occam's Razor applies here, but I've been looking at this for hours and can't figure out what's wrong.

0 投票
1 回答
666 浏览

c - 原始套接字 - Internet 协议层

我一直在使用 C 语言中的 Raw Berkeley Sockets,它允许程序员访问 Internet 协议套件的第 2 层(IP 标头)。我想知道原始套接字如何处理第 1 层(链路层)上的传输,特别是关于无线局域网。

例如,套接字如何知道将数据包发送到哪个网络接口(eth0 或 wlan0)?

如果我在无线路由器后面,是否仍应使用我的 LAN 地址 (192.168.1.1) 或路由器的 Internet 地址 (74.125.226.68) 填写我的 IP 标头的 IP 源地址?

如果我确实用我的 LAN 地址 (192.168.1.1) 填充 IP 源地址,IP 标头在通过路由器时是否会更改,还是保持不变,以便数据包的接收端尝试发送响应其网络上的本地主机?

我将不胜感激这方面的任何见解。

0 投票
3 回答
2174 浏览

c - 原始套接字:接收器打印垃圾值

我正在尝试使用发送器和使用原始套接字的接收器程序跨字符数组发送。我能够获得在接收端发送的正确字节数,但打印出来的值是垃圾。有人可以帮我吗?

发射机:

接收者 :

0 投票
1 回答
2982 浏览

sockets - 通过 Wifi 进行原始套接字通信 - 接收器无法接收数据包

我正在尝试使用原始套接字将数据包从发送器发送到接收器。当我在我的 Mac 或我的朋友戴尔(两者都安装了 Ubuntu 12.04)上同时部署发射器和接收器时,代码运行良好。我在两个不同的终端窗口中运行发射器和接收器,它工作正常。

但是当我在一台机器上运行发射器并在另一台机器上运行接收器时,接收器没有收到任何数据包。有人可以指出问题吗?我对套接字编程非常陌生,因此请原谅任何愚蠢的错误。

发射器:

/* 使用 sendto 发送数据包的函数 */

/* 为监视器接口创建原始套接字并将套接字绑定到接口的函数
*/

/* 主功能 */

接收者 :

数据结构 :

0 投票
1 回答
3988 浏览

c++ - 用于数据包注入的 Libnet 与原始套接字

我需要更有经验的网络程序员关于 GNU/Linux 系统上的数据包注入的一些意见/建议。我正在开发一个用于数据包注入和嗅探的开源 C++ 库。该库是libcrafter。在页面上有一些示例可以查看该库的工作原理。

我有一个两难境地,并会感谢你的想法。目前,库“提供”两种在线写入数据包的方法。首先,构造数据包:

1) 然后使用 Send() 函数发送:

2)或使用 RawSocketSend() 函数(这是我用于基准测试但可供用户使用的“实验性”函数):

其中 sd 是套接字描述符。如果数据包具有链路层协议(如以太网),则 sd 应该是 PACKET 套接字描述符。如果不是,则应该是 RAW 套接字描述符。

发送数据包的标准和记录方法是使用 Send() 方法。目前,Send() 方法使用libnet将数据包写入网络。

问题是 Send() 函数比 RawSocketSend() 慢得多......我经常不得不做很多棘手和烦人的事情来调整 libcrafter 处理协议字段的方式以正确使用 libnet_build*函数(这会导致性能损失)。每次我实现一个协议时,我都必须查看 libnet 文档,这使得开发过程变得非常乏味和缓慢。所以,我想停止使用 libnet 进行数据包注入,并在 Send() 函数中直接使用 RAW/PACKET 套接字。

Libcrafter 旨在以透明的方式为用户处理所有繁琐的数据包制作工作(校验和计算、字节排序、标头长度等)。在使用 RAW/PACKET 套接字(RawSocketSend 函数)的最流行的 GNU/Linux 系统(Ubuntu、Fedora、Debian)上一切正常。

我使用 libnet 的唯一原因是出于可移植性问题。但是我没有将 libcrafter 移植到其他系统而不是 GNU/Linux 系统的知识或意图。

我的问题是:

  1. 在 GNU/Linux 的数据包注入库上使用 RAW/PACKET 套接字是否谨慎且安全?
  2. 如果我决定停止使用 libnet,您是否知道关于 GNU/Linux 发行版之间的 RAW/PACKET 套接字的可移植性我应该考虑的一些问题?
  3. RAW/PACKET 套接字接口可能会在未来的内核版本中发生变化?

非常感谢 :-)

0 投票
0 回答
410 浏览

vb.net - 在 .NET 中接收无标准第 2 层数据包

我正在尝试在 .NET 中接收第 2 层数据包。我尝试在 RAW 模式下使用套接字但无济于事。

WireShark 数据包示例:

到目前为止,这是我尝试过的一件事:

0 投票
1 回答
705 浏览

ipv6 - IPv6 原始套接字。无法在 SIO_RCVALL 套接字上接收任何数据包。Win2008

我将 Windows Server 2008 R2 用于生产目的,因此使用原始套接字功能对我来说一定没有问题。但相反,我在入站 RCVALL 套接字上接收数据时遇到问题。我在做什么:

  1. m_recv_socket = socket( AF_INET6 , SOCK_RAW , IPPROTO_IPV6 ),
  2. setsockopt( m_recv_socket, SOL_SOCKET, SO_RCVTIMEO, reinterpret_cast<const char*>( &recv_timeout_ms ), sizeof(int) );
  3. bind( m_recv_socket, reinterpret_cast<sockaddr *>( &sa ), sizeof( sa ) ); (我在这里将它绑定到我的网卡的 LINK-Local 地址,即 fe80::a077:5573:5f:3ca5)
  4. WSAIoctl( m_recv_socket, SIO_RCVALL , &dwBufferInLen, sizeof(dwBufferInLen), &dwBufferLen, sizeof(dwBufferLen), &dwBytesReturned , NULL , NULL ); (其中 dwBufferInLen 等于 1)

当我尝试在此套接字上接收数据时,我不断收到 WSA_TIMEDOUT 并且没有收到任何数据。同时,Wireshark 证明此接口上存在入站和出站流量。怎么了?请问有什么帮助吗?为 IPv4 使用而修改的相同代码可以正常工作。上述调用的所有返回码都可以。

让我提供一些线索。存在类型(AF_INET6、SOCK_RAW、IPPROTO_IPV6)的未绑定发送套接字;正在设置 IPV6_HDRINCL。我通过它发送手动形成的 TCP 数据包。Wireshark 证明它通过了。接下来,我看到传入的 TCP(RST, ACK) 与我绑定接收套接字的地址完全一致。但是在数据接收试验时应用程序仍然被阻止。所有校验和都正常,否则不会有任何响应传入数据包。我确定这个传入的数据包是对我的 TCP(SYN) 请求的响应,因为 SEQ/ACK 数字证明了这一点(Wireshark 还向我显示了这个流的序列)。那么这个接收套接字可以做错什么呢?