问题标签 [recvfrom]

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 投票
0 回答
490 浏览

c - recvfrom 意外错误:参数无效

我正在使用 UDP 协议编写服务器-客户端应用程序。当我运行时,recvfrom我收到以下错误,我真的不明白为什么:

recvfrom:无效的参数

这是我假设与此错误相关的代码:

rcv_string以这种方式运行:

这是rcv_string(里面有对 的调用recvfrom)的实现。

可能是什么问题呢?(如果您认为我应该上传更多代码,请告诉我!)

0 投票
2 回答
1626 浏览

c - 从 recvfrom 收到错误地址:为什么?

我正在编写一个应该执行一些操作的函数,然后返回(使用它的参数)与函数内部交互(即使用的sendto)设备的地址recvfrom

这是我调用函数的方式,cliaddr之前实例化。

下面是函数的实现:

现在,即使发送设备的 IP 地址是192.168.1.251我得到以下输出:

接收到的缓冲区格式正确,但地址明显错误。为什么?和函数外的地址变量的定义有关系吗?

编辑

如果在之后memsetcliaddr还添加了这 3 行:

我得到一个随机的行为。有时我得到0.0.0.0,有时127.0.0.1有时是正确的地址(192.168.1.251)。

0 投票
0 回答
321 浏览

python - socket.recvfrom() 适用于一种类型的 UDP 流,但不适用于另一种

我知道有几个问题已经讨论了recvfrom函数挂起的问题,但是,我还没有找到导致我找到解决方案的问题/回复。

我的设置(有点hacky)

在我的设置中,我有一台运行 ubuntu 16.04 VM 的 Windows 10 机器(使用 VmWare Workstation 12 作为托管程序)。

  • 视窗 IP:192.168.0.100

  • Ubuntu IP:192.168.0.102

我的设置中最棘手的部分是我将 udp 数据包从主机发送到我的 VM 的方式。我有几个.pcap捕获的 UDP 数据包文件,我用一个名为PlayCap的程序将它们注入网络。通过此设置,我可以验证重放的数据包确实通过wireshark 正确注入到我的VM 网络中。

PCAP 文件信息

对于我的测试,我一直在使用两个不同的.pcap文件,其中包含来自两个完全不同的流的 UDP 数据包,但是,源 (192.168.0.100) 和目标 (192.168.0.102) IP 地址是相同的。它们也有相同的目的端口(5000)。

这可能需要解释,也可能不需要解释,但是这些 UDP 数据包的有效载荷的格式是非常不同的。一个有一个有效负载,其字节代表一个序列化的 XML 文档。另一个有效载荷只是一个字节数组,表示数组中不同位置的传感器测量值的不同值,等等。

如果您想知道我为什么要解释这些 UDP 消息的有效负载,请继续阅读。

问题

所以我的程序面临的问题是它可以成功地从一个重放的 UDP 流接收数据包,但不能从另一个接收数据包。一种有效的是带有 XML 有效负载的流。一个不起作用并导致recvfrom函数挂起并等待数据的是传感器数据有效负载。

使用 XML 有效负载数据包输出

一直持续到 PlayCap 播放完.pcap文件

使用传感器数据包输出

程序挂起recvfrom函数。

有谁知道我做错了什么或者可以提供任何关于为什么会发生这种情况的信息?我已经查看了套接字 API和所有其他涉及recvfromand的问题socket

更新

在深入挖掘并比较两个数据包的标头后,我发现源/目标mac地址存在差异。这是有道理的.pcap,因为传感器数据是在另一个人的计算机上捕获的,而 xml 数据是在我的机器上捕获的。所以我认为我的程序没有获取传感器数据,因为传感器数据被发送到正确的 IP 但不是正确的 Mac 地址。我通过将传感器板直接插入我的网络来验证这一点。包含传感器数据的 UDP 数据包立即被我的程序拾取。

0 投票
2 回答
403 浏览

c - 套接字是否允许在 C 中是全局的?

我正在制作一个程序,该程序不断检查通过套接字接收和发送数据,并且我有全局声明的套接字,它在 2 个线程函数中使用。我在 main() 中设置了套接字,一个线程使用套接字使用 recvfrom 并且工作正常,但是每当我尝试调用 sendto 时,它都会返回一个值 < 0,这让我感到困惑,因为 recvfrom 工作正常。

0 投票
1 回答
212 浏览

c - C - UDP 接收来自未知来源的数据包

我对 C 套接字编程相对较新,我必须用 C 解决一个任务。网络中有多个节点,每个节点都有自己的设置。每个节点每秒都会广播其当前设置。它还必须监听来自其他节点的这些广播并存储它们的设置。最后,它必须能够直接向另一个节点发送数据包。我打算将所有节点设置存储在一个结构数组中。

我已经设法完成了广播,这是在它自己的线程中实现的,但我不确定从网络中未知数量的其他节点接收数据包并存储它们的地址以直接向它们发送数据包的正确程序是什么之后。

有小费吗?

谢谢!

0 投票
1 回答
216 浏览

c - 套接字,使用 SOCK_DGRAM 的客户端服务器通信,epoll

我正在尝试使用 AF_INET、SOCK_DGRAM 编写程序,其中客户端连接到服务器发送消息"First message",然后服务器使用"Second message".

Q1:在我的代码服务器接收到"First message",但是客户端没有得到服务器响应"Second message",为什么?

Q2:在客户端我连接到服务器使用 msg_addr.sin_addr.s_addr =INADDR_ANY;我想将其更改为:msg_addr.sin_addr.s_addr =htonl(inet_addr("172.126.154.12"));其中 ip"172.126.154.12"是服务器 ip;

服务器.c

客户端.c

0 投票
1 回答
375 浏览

sockets - ICMP RAW Socket 接收不完整

我已经在 linux 中实现了一个 RAW Socket 来发送和接收 ICMP 数据包,我已经使用创建 RAW Socketsocket(AF_INET, SOCK_RAW, IPPROTO_ICMP)并开始使用recvfrom. 最初,我接收缓冲区 len 设置为 1000recvfrom的数据包,然后根据 ICMP 和 IP 标头对数据包进行类型转换。

但是当我开始单独接收数据包标头和数据时(首先接收 IP 标头的 20 个必要字节,然后从该标头中找到数据 len 并使用 接收那么多字节的数据recvfrom)。我无法接收数据部分,因为我无法接收第二个数据部分。

第一种方法:

第二种方法:

在第二种情况下,第二个接收不接收任何东西。

0 投票
1 回答
834 浏览

udp - UDP - 是否可以在一个接收呼叫中接收多条消息?

1. 一个接收电话可以接收多条消息吗?

发件人伪代码:

接收器伪代码:

接收者是否有可能"HelloWorld"在一个接收呼叫中而不是"Hello"单独接收"World"

有人告诉我这可能的,但我想确定一下。

2. 如果可以在一个接收调用中接收多条消息,我如何确保我的代码分别处理两条消息?

我一直在考虑这个问题,但无法提出任何解决方案。

我的第一个想法是在发送调用的开头添加一个字节,说明消息的长度。

我也不相信这会是可靠的,因为如果接收器缓冲区中有太多数据,那么开头(消息长度)可能会被切断,因此我的程序会失败。


谢谢你的帮助!

0 投票
1 回答
639 浏览

python - 为什么 python socket.recvfrom 得到的字节流与 WireShark 爬取的字节流不同?

我使用 python 套接字发送 DNS 查询数据包套接字并监听响应。socket.recvfrom(2048)最后,我按预期得到了函数的DNS响应包。但奇怪的是,我将响应数据包与 Wireshark 抓取的数据包进行比较,发现存在很多差异。

3f在第二张图片中会发现差异。

Wireshark爬取的DNS响应包(高亮部分)

收到的DNS响应包socket.recvfrom(2048)

创建插座零件代码:

接收 DNS 响应数据包部分代码:

0 投票
1 回答
1132 浏览

c++ - 无法接收 UDP 广播消息

我正在尝试组装一个 UDP 监视器。我认为这将是直截了当的,但我所尝试的一切都失败了。

目前,我正在使用 Microsoft代码示例。由于我过去的尝试失败,我只是复制了网站的代码并更改了端口号(见下文),但我仍然无法接收数据报。

使用 Wireshark,我看到消息按预期进入(源 IP 地址为 10.1.1.150) Wireshark 捕获

我已在我的 Windows 10 防火墙中添加了规则,以确保端口 18190 已打开并且不会拒绝在该端口上进出的消息。

许多网站声明,对于客户端,您不应该绑定套接字,但如果我不绑定套接字,recvfrom()则会立即返回 -1 和错误WSAEINVAL,指出“提供了无效参数。”</p>

注意:我想使用recvfrom()而不是recv(),因为我需要发件人地址信息。

谁能帮我理解为什么这段代码没有收到广播的 UDP 数据报?

更新

sendto()我尝试在调用之前通过发送消息recvfrom()。Wireshark 显示消息已发送到 10.1.1.150,但recvfrom()仍然没有收到任何信息(即它只是永远阻塞)。

更新 2

使用上面的代码,如果我将计算机的静态 IP 地址设置为 10.1.1.255,那么我就能够接收数据包。这告诉我代码能够接收数据包,但仍然无法解释为什么我无法接收广播数据包。