问题标签 [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 投票
1 回答
399 浏览

c - 原始套接字。ip header 何时使用 hton

我是原始套接字的新手,我正在玩 ip header。ip->ip_hl = sizeof(struct ip) >> 2 //works fine; 但是 我注意到 ip->ip_hl = hton(sizeof(struct ip) >> 2) //will not work;

我不明白的是,在这种情况下,为什么不将所有数字转换为网络顺序而不是主机顺序?判断何时使用网络顺序/主机顺序的一般规则是什么?

谢谢

0 投票
2 回答
188 浏览

linux - 我们可以在使用原始套接字时选择特定的接口吗?

我正在 linux 中构建一个仅通过某个接口发送数据的应用程序。我可以使用原始套接字来做到这一点,也许使用设置套接字选项功能?

0 投票
1 回答
3079 浏览

windows - 为什么 ping 不需要 Windows 上的管理权限?

可能重复:
为什么 ping 在没有管理员权限的情况下工作?

来自关于 TCP/IP 原始套接字的MSDN文章:

...重要的是要了解某些 SOCK_RAW 类型的套接字可能会收到许多意外的数据报。例如,一个 PING 程序可能会创建一个 SOCK_RAW 类型的套接字来发送 ICMP 回显请求并接收响应......

这段话表明,为了执行 ICMP ping,必须在 Windows 平台上使用原始套接字。但是,同一篇文章也说:

注意: 要使用 SOCK_RAW 类型的套接字需要管理权限。运行使用原始套接字的 Winsock 应用程序的用户必须是本地计算机上管理员组的成员,否则原始套接字调用将失败并返回错误代码 WSAEACCES。在 Windows Vista 和更高版本上,对原始套接字的访问是在创建套接字时强制执行的。在早期版本的 Windows 中,对原始套接字的访问是在其他套接字操作期间强制执行的。

我当然不需要成为ping其他主机的管理员。那么是否ping.exe得到特殊处理,它甚至使用原始套接字还是我还缺少其他东西?

0 投票
1 回答
1226 浏览

c - 发送原始 eth 数据包。我应该什么时候关闭套接字?

我通过从 nfqeueue 获取数据包来实现桥接,打开到 eth 卡的套接字并发送数据包(我中间有一些逻辑)。

我是 cpp 和低级别的新手,所以我可能会问一些愚蠢的问题。

如果我理解正确,我不应该为每个数据包打开关闭套接字。我根据这个例子编写我的代码 - http://austinmarton.wordpress.com/2011/09/14/sending-raw-ethernet-packets-from-a-specific-interface-in-c-on-linux/

我像这样打开套接字:

我的问题是: 1.插座能活多久? 2.如何检查我的插座是否仍然打开?3.如何关闭?我看到了关机,但我不知道这是否是 API?4.有人可以指导我举一个生产级别的例子吗?意味着处理套接字异常...

谢谢

0 投票
2 回答
4770 浏览

c++ - 异步 lib​​pcap:丢包?

我有一个程序将一组 TCP SYN 数据包发送到主机(使用原始套接字)并使用libpcap(使用过滤器)来获取响应。我正在尝试在异步 I/O 框架中实现这一点,但似乎缺少一些响应(即当它在 TCP SYN 和响应之间libpcap花费的时间少于一系列的第一个数据包时)。100 microsecondspcap 句柄设置如下:

然后我添加一个过滤器(包含在 filterExpression 字符串中):

在一个循环中,在发送每个数据包后,我使用 select 来知道我是否可以从 libpcap 中读取:

并阅读它:

正如我之前所说,一些数据包被遗漏(落入“没有收到”的其他情况)。我知道这些数据包在那里,因为我可以以同步方式(使用tcpdump或正在运行的线程pcap_loop)捕获它们。我在这里遗漏了一些细节吗?或者这是一个问题libpcap

0 投票
4 回答
16387 浏览

c - 时间戳传出数据包

我正在尝试获取传出数据包的准确时间戳(使用原始套接字发送)。根据Linux/Documentation/networking/timestamping.txt,“对于发送时间戳,传出的数据包将循环回套接字的错误队列,并附上发送时间戳。它可以通过 recvmsg(flags=MSG_ERRQUEUE) 接收。”。

不幸的是,在原始套接字上调用时recvmsg总是返回(使用并设置为with创建)。我究竟做错了什么?有没有更好的方法来获取传出数据包的准确时间戳?-1socket(PF_INET, SOCK_RAW, IPPROTO_RAW)SO_TIMESTAMP1setsockopt

附录(信息):

我还尝试从通过 UDP 套接字(下面的源代码)发送的数据包中获取时间戳并recvmsg返回-1:错误是“资源暂时不可用”(EAGAIN)。

附录(源代码):

0 投票
2 回答
10042 浏览

linux - 创建 SOCK_RAW 套接字仅用于发送数据而无需任何 recvform()

如果我创建一个类型为 SOCK_RAW 的套接字仅发送一些数据而不接收任何数据,那么当内核继续接收网络数据包并将其数据报复制到某个缓冲区(应用程序?)时是否有任何问题。换句话说,在 somebuffer 被填满之后会发生什么?错误还是忽略?

我不知道如何防止内核将数据报副本传递给我的应用程序。

参考http://sock-raw.org/papers/sock_raw 0x4 raw_input

在 IP 层处理新的传入 IP 数据报后,它调用 ip_local_deliver_finish() 内核函数,该函数负责通过检查 IP 标头的协议字段来调用已注册的传输协议处理程序(请记住上面的内容)。但是,在将数据报传递给处理程序之前,它每次都会检查应用程序是否创建了具有相同协议号的原始套接字。如果有一个或多个这样的应用程序,它会制作数据报的副本并将其传递给它们。

0 投票
1 回答
1769 浏览

linux - 无法使用 PF_PACKET 将原始数据包发送到本地 mac?

我一直在玩使用构建的以太网协议(不是 IP)

套接字(PF_PACKET,SOCK_RAW,ether_type)

我有一个小问题。我已经构建了一个数据包,其中源和目标 mac 设置为我的本地卡 mac,我还使用 bind 绑定了套接字。

我可以很好地从网络接收数据包。我能够将数据包发送到我看到它们出现在wireshark中的程度。

但是,我的监听应用看不到这些数据包。但是,它能够看到来自网络上其他来源的数据包。

我应该指出,我的 mac 地址似乎是以正确的字节顺序发送的。

你可以给自己发送数据包吗?

网卡不回环吗?linux内核是否在IP级别为环回做了一些特殊的事情,因为我低于这个,忽略我?

0 投票
2 回答
3374 浏览

c++ - 为什么我的程序不发送 ARP 请求(c++)?

我正在用 c++ 学习低级套接字。我做了一个简单的程序来发送一个 ARP 请求。套接字似乎发送了数据包,但我无法用 Wireshark 捕获它。我有另一个小程序,它也发送 ARP 数据包,这些数据包被 Wireshark 捕获(我下面的程序受到该程序的启发)。

我做错了什么吗?

删除代码

编辑

删除代码

编辑 2
似乎我还需要在数据包中包含以太网头数据,所以我现在制作一个包含以太网头和 ARP 头数据的数据包。现在数据包消失并被 Wireshark 捕获。但 Wireshark 说这是免费的。如您所见,发送方和接收方的 IP 或 MAC 地址似乎都没有正确设置。


编辑 3

0 投票
3 回答
1519 浏览

c - 用于获取 Windows、Linux 和 Mac 的 TCP 序列号的 C 代码

有没有办法(使用原始套接字或其他方式)来获取进程使用的 TCP 序列号。例如,如果一个进程处于活动状态并且有一个活动的 TCP 连接,是否有可能从进程启动时获取该进程的 TCP 序列号,或者至少是它接收或发送的最后一个确认号?如果是这样,我该如何使用 C 或任何低级语言来做到这一点?

实际上,可以:

  • ProcessA 检测到与活动 ProcessB 相关联的已发送的 TCP 序列号(在 ProcessA 启动时)?

或者

  • ProcessA 可以在事后检测到 ProcessA 接收或发送的最后一个 ACK​​ 号吗?