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

windows - Winsock 下出现罕见 sendto()/recvfrom() 问题的原因?

我们最近观察到显示以下症状的罕见 UDP 通信问题:

  1. 套接字sendto()调用失败并出现错误WSAENOBUFS (10055)
  2. 尽管 Wireshark 显示网络接口实际上收到了预期的数据报,但对该套接字的后续recvfrom()调用不会收到任何内容。这种情况持续大约 8 秒,之后可以再次从套接字接收新的传入数据报。
  3. 在 Windows 系统日志中,出现错误时出现了内核常规信息条目sendto()The access history in hive \??\C:\ProgramData\Microsoft\Provisioning\Microsoft-Desktop-Provisioning-Sequence.dat was cleared updating 0 keys and creating 0 modified pages.

该问题发生在运行 Microsoft Windows 10 Pro for Workstations 版本 10.0.17763 Build 17763 的客户系统上。

在该系统上,我们能够通过一个用 C++ 编写的简单测试程序来重现该问题,该程序与 UDP 数据报相呼应。我们验证了从套接字接收的线程实际上一直在响应,通过使用 指定 1 秒的超时SO_RCVTIMEO,打印一些“仍然活着”的输出并立即recvfrom()再次调用。

在我们自己的测试系统上,我们无法在与客户相同的情况下观察到问题。但是,当测试运行时,我们可以在使用网络适配器设置时产生类似的效果。启用会Microsoft LLDP Protocol Driver显示sendto()错误,有时还会导致 8 秒的“静默”期,但没有任何 Windows 系统日志条目。

非常感谢任何提示。

0 投票
1 回答
288 浏览

c - 如何将 recvfrom() 中的缓冲区值保存到数组中?

我正在研究 BSD 套接字并使用此功能

但在服务器中打印消息之前,我想将缓冲区的值保存在 char 数组中并进行一些操作。怎么做?

编辑:示例

缓冲区存储一条消息“你好”,我的数组应该看起来像arr[]={'h','e','l','l','o'}

0 投票
1 回答
524 浏览

udp - RecvFrom 缺少一些 UDP 数据包

好的,我知道 UDP 不能保证传递,但我希望通过将 RecvFrom 放在具有 TimeCritical 优先级的线程中并快速将传入消息移动到缓冲区中来捕获所有内容。但是,当消息的速率达到每秒大约 1000 1500 字节消息时,会丢失一些消息。我已经用 WireShark 验证了这些消息实际上是由计算机接收的。

我很确定从 RecvFrom 返回到再次调用它之前,消息在极短的时间内丢失了。

有什么办法可以“抓住所有”,因为显然收到了消息?

谢谢。

0 投票
1 回答
174 浏览

c - c中的IPv6服务器-recvfrom失败

我用 winsock2.h 为 IPv6 服务器编写了一个小型 c 程序当我在 Visual Studio 中运行该程序时,我一直收到以下消息:recvfrom failed

我只是在 recvfrom 函数中找不到错误。也许有人可以看到为什么我的程序在这一点上不起作用,谢谢!:-)

最好的问候,肯

0 投票
1 回答
827 浏览

sockets - 如何在 nasm 中使用 recvfrom 获取 UDP 数据包的源 IP 地址?

我正在用 nasm 编写一个 UDP 套接字,我正在使用 recvfrom 系统调用来接收来自客户端的 UDP 数据包。

我可以成功发送消息,但我想将答案发回给客户。问题是我无法提取数据包的源IP地址,所以无法使用sendto系统调用。

这是UDP服务器的代码:

在 network.inc 我有:

作为 UDP 客户端,我使用 netcat 命令:netcat -u 127.0.0.1 4096

0 投票
1 回答
79 浏览

c - 解析来自 UDP 套接字的 recvfrom() 消息的意外行为

目前正在使用 UDP 套接字,我被困在试图了解以下情况。

接收缓冲区定义如下:

& 通过调用 recvfrom() 来填充

我从远程获取这些数据,使用 Wireshark 确认:

使用一个简单的for循环来识别缓冲区内容,我得到:

我当然误解了一些试图获取/解析收到的消息的东西,但我无法解释为什么打印 buf[1]、buf[26]、buf[30]、buf[31] 和 buf[32] 会返回额外的 FF ?

使用 gdb 的相同行为

任何提示将不胜感激。

0 投票
1 回答
29 浏览

c - 无法使用结构来存储和稍后使用 recvfrom 打印 udp 数据

我正在尝试使用以下结构将收到的数据放入:

这是打印功能:

在我的主要工作中,我正在尝试将接收到的数据保存在我的结构中:

输出:

Magic、Version、Body Length 是数据包开头的预期输出。由于其他对等方遵循的协议,数据包的最大限制大小为 1024 字节。

但是,我的 displayPacket 函数引起了分段错误,更准确地说是这一行:

如果可以提供帮助,这是 valgrind 输出:

尽管它看起来很微不足道,但它一直困扰着我几个小时......

预期的输出将是数据包中其余内容的内容。到目前为止,我已经能够做到。

请问您有什么解决方案来解决这个问题?

谢谢。

编辑 1:

通过像这样修改结构解决了分段错误问题:

和其余的代码:

displayPacket 保持不变。

0 投票
1 回答
358 浏览

c - winsock2:RAW SOCKET recvfrom() 返回错误 10022(无效参数)

我正在尝试在 Windows 10 中使用 RAW SOCKET 处理传入的网络数据包。

当我调用recvfrom()函数时,它返回 -1 值。WSAGetLastError是 10022。

Microsoft Docs 页面给了我以下描述:

WSAEINVAL: 10022
参数无效。
提供了一些无效参数(例如,为 setsockopt 函数指定无效级别)。在某些情况下,它还指代套接字的当前状态——例如,在未侦听的套接字上调用接受。

我尝试使用setsockopt()to 设置IP_HDRINCL为 1,但是当我调用recvfrom().

我的源代码:

返回:

0 投票
1 回答
135 浏览

c - 是否有任何 C 套接字函数可以查找来自特定 UDP 客户端的数据报?

我正在构建的服务器使用 UDP 传输层协议。我有一个场景,多个客户端可以将数据报发送到我的服务器。但是每个客户端可能会跨多个数据报发送数据,在开始处理数据之前,我需要在服务器上拥有整个数据。从手册页recvfrom()看,它听起来像是从任何 UDP 客户端读取数据报。是否有任何recv*()家庭功能使我们能够从特定的 UDP 客户端读取?

如果不是,我的其他选择是什么?

0 投票
0 回答
81 浏览

c - 客户端从服务器接收错误消息 (UDP)

我正在使用 UDP 编写私人聊天,但在实现注册服务时遇到了一些问题。当客户端写入他要使用的ID和密码时,服务器会检查ID是否已经存在(ID和密码保存在一个文件中),如果不存在,客户端可以开始与其他用户聊天(我仍然没有实现这部分),如果 ID 已经在使用中,我想告诉用户选择另一个 ID。在这种情况下,我使用 sendto 向客户端发送消息“ID 已在使用中”,但 recvfrom 有时会接收其他消息。正是当用户第一次选择了错误的 ID 时,他收到了正确的消息,然后,如果他再次选择一个已经在使用的 ID,从他从服务器收到的消息中,他读取了他尝试选择的 ID,而不是错误信息。最奇怪的是,在第三次错误尝试时,错误消息是正确的。消息和相关函数在名为 utils.h 的文件中定义

这是服务器:

这是客户端文件:

ID和密码存放在文件“utenti.txt”中,用分号隔开,依次为:ID1;password1 ID2;password2 ... 希望我已经把我的问题搞清楚了,谢谢你的帮助!