问题标签 [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.
windows - Winsock 下出现罕见 sendto()/recvfrom() 问题的原因?
我们最近观察到显示以下症状的罕见 UDP 通信问题:
- 套接字
sendto()
调用失败并出现错误WSAENOBUFS (10055) - 尽管 Wireshark 显示网络接口实际上收到了预期的数据报,但对该套接字的后续
recvfrom()
调用不会收到任何内容。这种情况持续大约 8 秒,之后可以再次从套接字接收新的传入数据报。 - 在 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 系统日志条目。
非常感谢任何提示。
c - 如何将 recvfrom() 中的缓冲区值保存到数组中?
我正在研究 BSD 套接字并使用此功能
但在服务器中打印消息之前,我想将缓冲区的值保存在 char 数组中并进行一些操作。怎么做?
编辑:示例
缓冲区存储一条消息“你好”,我的数组应该看起来像arr[]={'h','e','l','l','o'}
udp - RecvFrom 缺少一些 UDP 数据包
好的,我知道 UDP 不能保证传递,但我希望通过将 RecvFrom 放在具有 TimeCritical 优先级的线程中并快速将传入消息移动到缓冲区中来捕获所有内容。但是,当消息的速率达到每秒大约 1000 1500 字节消息时,会丢失一些消息。我已经用 WireShark 验证了这些消息实际上是由计算机接收的。
我很确定从 RecvFrom 返回到再次调用它之前,消息在极短的时间内丢失了。
有什么办法可以“抓住所有”,因为显然收到了消息?
谢谢。
c - c中的IPv6服务器-recvfrom失败
我用 winsock2.h 为 IPv6 服务器编写了一个小型 c 程序当我在 Visual Studio 中运行该程序时,我一直收到以下消息:recvfrom failed
我只是在 recvfrom 函数中找不到错误。也许有人可以看到为什么我的程序在这一点上不起作用,谢谢!:-)
最好的问候,肯
sockets - 如何在 nasm 中使用 recvfrom 获取 UDP 数据包的源 IP 地址?
我正在用 nasm 编写一个 UDP 套接字,我正在使用 recvfrom 系统调用来接收来自客户端的 UDP 数据包。
我可以成功发送消息,但我想将答案发回给客户。问题是我无法提取数据包的源IP地址,所以无法使用sendto系统调用。
这是UDP服务器的代码:
在 network.inc 我有:
作为 UDP 客户端,我使用 netcat 命令:netcat -u 127.0.0.1 4096
c - 解析来自 UDP 套接字的 recvfrom() 消息的意外行为
目前正在使用 UDP 套接字,我被困在试图了解以下情况。
接收缓冲区定义如下:
& 通过调用 recvfrom() 来填充
我从远程获取这些数据,使用 Wireshark 确认:
使用一个简单的for
循环来识别缓冲区内容,我得到:
我当然误解了一些试图获取/解析收到的消息的东西,但我无法解释为什么打印 buf[1]、buf[26]、buf[30]、buf[31] 和 buf[32] 会返回额外的 FF ?
使用 gdb 的相同行为
任何提示将不胜感激。
c - 无法使用结构来存储和稍后使用 recvfrom 打印 udp 数据
我正在尝试使用以下结构将收到的数据放入:
这是打印功能:
在我的主要工作中,我正在尝试将接收到的数据保存在我的结构中:
输出:
Magic、Version、Body Length 是数据包开头的预期输出。由于其他对等方遵循的协议,数据包的最大限制大小为 1024 字节。
但是,我的 displayPacket 函数引起了分段错误,更准确地说是这一行:
如果可以提供帮助,这是 valgrind 输出:
尽管它看起来很微不足道,但它一直困扰着我几个小时......
预期的输出将是数据包中其余内容的内容。到目前为止,我已经能够做到。
请问您有什么解决方案来解决这个问题?
谢谢。
编辑 1:
通过像这样修改结构解决了分段错误问题:
和其余的代码:
displayPacket 保持不变。
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()
.
我的源代码:
返回:
c - 是否有任何 C 套接字函数可以查找来自特定 UDP 客户端的数据报?
我正在构建的服务器使用 UDP 传输层协议。我有一个场景,多个客户端可以将数据报发送到我的服务器。但是每个客户端可能会跨多个数据报发送数据,在开始处理数据之前,我需要在服务器上拥有整个数据。从手册页recvfrom()
看,它听起来像是从任何 UDP 客户端读取数据报。是否有任何recv*()
家庭功能使我们能够从特定的 UDP 客户端读取?
如果不是,我的其他选择是什么?
c - 客户端从服务器接收错误消息 (UDP)
我正在使用 UDP 编写私人聊天,但在实现注册服务时遇到了一些问题。当客户端写入他要使用的ID和密码时,服务器会检查ID是否已经存在(ID和密码保存在一个文件中),如果不存在,客户端可以开始与其他用户聊天(我仍然没有实现这部分),如果 ID 已经在使用中,我想告诉用户选择另一个 ID。在这种情况下,我使用 sendto 向客户端发送消息“ID 已在使用中”,但 recvfrom 有时会接收其他消息。正是当用户第一次选择了错误的 ID 时,他收到了正确的消息,然后,如果他再次选择一个已经在使用的 ID,从他从服务器收到的消息中,他读取了他尝试选择的 ID,而不是错误信息。最奇怪的是,在第三次错误尝试时,错误消息是正确的。消息和相关函数在名为 utils.h 的文件中定义
这是服务器:
这是客户端文件:
ID和密码存放在文件“utenti.txt”中,用分号隔开,依次为:ID1;password1 ID2;password2 ... 希望我已经把我的问题搞清楚了,谢谢你的帮助!