问题标签 [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.
c++ - 使用 MSG_DONTWAIT 的 C UDP 接收套接字总是失败
我正在开发一个 UDP 客户端/服务器应用程序,并且我的发送命令的应用程序运行良好 - 我可以监控通过 nc 和 hexdump 发送到端口的内容,它们完美解码。
在我应该接收命令的应用程序上,我正在使用带有 MSG_DONTWAIT 标志的 recvfrom。我这样做是因为我还需要检查队列以查找要发送的内容,因此仅将其保留为阻塞状态不是一种选择。如果我删除 MSG_DONTWAIT 标志,则会正确接收和处理消息,但它会阻止等待,这对我的应用程序不起作用。当使用 MSG_DONTWAIT 时,它总是返回 -1 并将 errno 设置为 EAGAIN。虽然在没有发送任何内容时会出现这种情况,但它根本不会收到任何内容。我认为它会返回 EAGAIN 直到有东西可用,但情况似乎并非如此。相关代码发布在下面 - 我错过了什么?
c - recvfrom() 将 src_addr 保存为什么字节顺序?
size_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen)
参数以什么字节顺序src_addr
写入?网络还是主机?recvfrom
我在手册页或通过 google 和 SO 搜索时找不到这个。
c++ - Recvfrom 在本地工作,但在执行之间的随机端口上没有收到任何内容
我正在研究一个多线程 UDP 侦听器,但我遇到了一个绝对超越我的问题。
所以,我需要在多个端口接收大量的 UDP 数据包。在本地,对我来说最好的解决方案是在与我正在监听的端口一样多的线程中调用非阻塞 recvfrom(选择和轮询对于我的要求来说太慢了)。我正在使用线程池管理器,它只是调用线程和队列任务。这是代码:
这在本地工作得很好。但是当我在生产环境中编译它时,一些端口监听数据包而其他端口根本不监听!并且工作端口在每次执行中都会发生变化。我可以,确认不是防火墙问题。我也可以通过 Wireshark 清楚地看到数据包。我可以通过 netcat 在这些端口上接收数据包。Netstat 显示所有打开的端口。
我的本地环境是Ubuntu 18.04 VM,生产环境是Debian 9.8。
这是我调用套接字的方式:
非常感谢任何建议!
编辑:
正如建议的那样,我尝试切换到阻塞 I/O,但主要问题仍然存在。仍然没有收到所有打开的端口。
c - Recvfrom 和 Wireshark
我与服务器通信,我使用套接字(sock_raw ..)发送消息,它工作正常,客户端(我)发送消息,服务器接收到正确的消息,但是当服务器需要将它发送给我时(客户端),客户端不使用recv从中检索正确的信息。
我在两次调用 server->client 时检索到它:
但是我的缓冲区需要等于这个数据并且有这个大小:
这就是我使用 recvfrom 函数的方式(t->sock 是服务器的套接字 fd,t->msg_recv 是为从服务器接收 msg 而创建的缓冲区,t->_recv 是接收的 sockaddr* 结构) :
Barmar 这里是 Wireshark 消息 send 的输出:
这是同一函数上的 send 和 recvfrom 的代码:
c++ - Getting undocumented error code from recvfrom
When attempting to read UDP packets using recvfrom
the function returns -1 indicating an error. I of course then call WSAGetLastError
to find out what the problem is. The reported error number is 183. I cant seem to find any reference as to what that number means.
Edit:
Edit:
c++ - c++ udp recvfrom 最终挂在远程连接上
我正在用 C++ 编写客户端服务器 udp 应用程序。当客户端和服务器在同一台机器上运行时,应用程序可以正常工作,但是当我在笔记本电脑上运行客户端并在 AWS 中的 ec2 实例上运行服务器时,服务器会收到 4 条消息,然后开始挂起recvfrom
。客户端以 500 字节的块发送文件,服务器将这些文件写入文件。ack
服务器在收到每个块后发送一个。客户端有 2 秒的超时,如果它在超时之前没有收到ack
它会重新发送前一个块。这是我的客户代码
它每次发送正好 508 个字节,除了第一个段只有 10 个字节。我在每次迭代后打印 sendto 的结果,看起来总是这样
* **Update *** 一旦服务器开始挂起recvfrom
并且客户端超时等待ack
,客户端开始连续打印以下错误,因为它不断重新发送块。
服务器代码看起来像
这打印
但是它只打印了 4 次,然后它挂在 recvfrom 上,而客户端继续发送 508 个字节,段大小保持在 508 in recvfrom
。为什么 recvfrom 开始工作然后突然停止?
更新
我将其简化为我可以编写的最简单的 udp 客户端服务器,这是客户端:
这是服务器:
并且发生了同样的行为,服务器收到 4 条消息,但在第五条消息上它只是挂起recvfrom
。我尝试在服务器上的每次迭代中关闭并重新打开套接字,但没有效果。
c - SO_RCVTIMEO 超时值在 recv_from API 中不生效
当 recvfrom API 中没有数据时,我尝试使用 SO_RCVTIMEO 选项超时。但是这并没有生效,而且源头没有数据的时候,代码就卡住了。
我什至尝试使用 recv 而不是 recvfrom。还是同样的问题。
如果我的代码中缺少任何内容,请告诉我。
c - 为什么 UDP 组播服务器没有响应?
我正在尝试在 Linux 上实现基本的 UDP 多播客户端和服务器。服务器基于客户端发送的消息,应该使用系统参数(有点像 SNMP)进行回复。现在,我正在使用单个服务器进行测试。在不同的终端上运行客户端和服务器后,我向服务器发送了一个 3 个字符的请求,但似乎服务器无法继续,只是在那里暂停,等待客户端。代码在这里给出:
客户:
这之后的部分特定于我的应用程序:除非您想对其进行测试,否则可能会被忽略。
这是服务器:
和以前一样,特定于应用程序的部分。
已经用了2天了。无法弄清楚我哪里出错了。由于服务器没有显示任何反应,我假设初始部分(服务器端的 recvfrom)有问题,因此以这种方式拆分代码。对不起,如果我犯了一些明显的菜鸟错误。
c - C中sendto()和recvfrom()之间的形式参数区别
我正在使用recvfrom()
andsendto()
来接收和发送 UDP 数据包。
我注意到recvfrom()
最后一个参数需要一个指向存储服务器地址长度的变量的指针,而sendto()
需要存储客户端地址长度的变量。
为什么会有这种差异?