问题标签 [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 回答
522 浏览

sockets - 使用 BINDTODEVICE 时无法监听多个套接字?

我有两个到 Internet 的网络链接,并且设置了两个默认路由:

我用 BINDTODEVICE 创建了两个套接字,这样我就可以将数据从 eth0 或 eth1 发送出去。我还尝试使用recvfrom(仅 UDP 数据)监听两个套接字,但我只能从路由中首先列出的任何接口成功读取数据。eth0例如,有效,但我从绑定到eth1.

在任一接口上运行 wireshark 都显示数据成功进入 - 也就是说,我可以看到数据从 Internet 发送到 Wireshark 中的 eth0 或 eth1 的 IP(因此 NAT 都不是问题),但我的程序只是阻塞recvfrom而没有得到任何数据。

我尝试bind在套接字上使用以使它们在各自接口的 IP 上侦听,并且还尝试不使用 bind 让它们在 0.0.0.0 上侦听(每个端口都在不同的端口上),但我仍然遇到同样的问题。

我怎样才能确保两个套接字都得到它们应该得到的数据?

编辑:示例代码:

0 投票
1 回答
203 浏览

c++ - C++:服务器和客户端之间的经典通信练习

再会。

作为一名学习低级 C 编程的计算机科学专业的学生,​​我被困在编写服务器-客户端通信程序的“经典”实践练习中。

目标是开发一个服务器组件,它接收来自远程客户端组件的命令,并将其作为本地 shell 命令执行;然后,命令的输出再次发送到客户端。很简单。

我的代码从客户端发送命令,服务器成功接收它,执行它并捕获输出。但是此时,当所说的服务器尝试将该输出回复给客户端时......出现问题并且客户端什么也没有收到。不知道问题是在服务器部分还是在客户端对应部分。

任何想法?提前致谢!

服务器:

客户:

假设我使用以下命令打印所有痕迹: fprintf(stderr, ""); 因此,由于分叉而失去终端的焦点应该不是问题。

再见,谢谢!

0 投票
1 回答
2061 浏览

c - 对 poll() 和 recvfrom() 的混淆

我正在尝试在 C 中实现一个发送/接收原始以太网帧的协议,并且在 Linux 环境中使用poll()和遇到了一些问题。recvfrom()我认为我的问题主要是概念性的,所以我暂时避免发布我的代码。

我有两个用于传入数据的套接字,用于通过其返回值和关联结构poll()的状态来指示数据何时在任一套接字上准备就绪。pollfd当我第一次运行程序时,这对我有用。为了测试,我只对 ARP 帧感兴趣,我可以用来poll()等待 ARP 帧到达。当它到达时,我打电话recvfrom()将数据复制到我可以处理它的位置。所有这些工作正常。

poll()问题是即使没有新数据到达套接字,后续调用仍会继续报告数据已准备好从套接字读取。一旦我调用recvfrom()并从套接字读取数据,我想poll()等到新帧到达之前报告数据已准备好。我以前从未使用poll()过,所以我不确定是否需要明确的步骤来“清除”描述符,以便poll()在新帧进入之前停止报告数据准备就绪。我正在清除revents成员调用之前的pollfd结构poll(),但每次调用poll()都将值设置revents回 1。

我浏览了poll()手册页,但没有找到有关此信息的任何运气。我觉得我误解了套接字/轮询如何在高级别的工作,所以任何帮助将不胜感激。

[编辑] 这是我的大部分代码。实际上,我通过仅包含一个套接字来简化了此示例的代码。所有这些也都封装在类中并展开,但是像这样重写它会重现我的问题。我的最终代码对 API 调用进行了错误检查,并复制了我的接收缓冲区以处理帧,而不仅仅是打印内容,但除此之外它几乎相同。

我最初没有提到这一点,但我正在尝试将此代码部署在 Beaglebone Black 上。当我在使用 GCC 编译的 Ubuntu 的 VM 中运行该程序时,它可以按我的预期工作。在接收/打印一帧后,程序在视觉上处于空闲状态,直到新的帧到达。当我交叉编译程序并运行它时,程序会不断打印相同的数据包,直到新的数据包到达。由于我在receiverBuffer[]每次recvfrom()返回时都会recvfrom()清除,因此一旦将数据复制到我的缓冲区中,似乎就不会从其内部缓冲区中清除数据,因为它会不断地复制数据。

0 投票
1 回答
2550 浏览

python - TCP 的 recv() 和 recvfrom() 方法

为什么TCP socket.recvfrom()不像 UDP 那样返回发送者地址?

TCP socket.recv() 什么时候是空字符串?

谢谢!

0 投票
2 回答
156 浏览

c - CentOS 和 Windows 之间关于端口号的不同行为

我已经制作了 C 程序,它们是服务器和客户端。他们使用 udp 互相发送消息。

服务器一直等到客户端发送消息。

当我从客户端控制台键入一些消息时,客户端会将消息发送到服务器。

服务器从客户端接收消息,然后服务器将在其控制台上回显该消息并将相同的消息发送回客户端。

最后,客户端在其控制台上显示服务器发回消息的消息。

在此过程中,客户端在其控制台上显示其源端口号。服务器还显示发送消息的客户端的源端口号recvfrom ()

奇怪的是,如果我在 windows7 上运行它们,客户端和服务器之间的源端口号是不同的,但如果我在 CentOS6.4 上运行它们,源端口号是相同的。

有谁知道这是怎么回事?

我的代码如下。

[服务器]

[客户]

0 投票
0 回答
426 浏览

c++ - 尝试读取 UDP 数据报时,recvfrom 返回错误

我正在尝试制作一个非常简单的 UDP 服务器,但我似乎无法掌握如何去做。我查看了 Microsoft 文档,但即便如此,我也遇到了这个问题。似乎 recvfrom 函数返回一个错误,调用 WSAGetLastError 告诉我这是一个无效的参数错误,但对我来说,参数似乎是正确的:

任何帮助,将不胜感激。

0 投票
1 回答
1856 浏览

sockets - recvfrom 重新读取套接字上的数据

我正在创建一个简单的服务器/客户端 UDP 套接字程序,但遇到了问题。

问题是 recvfrom() 函数不断地重新读取最后发送的数据。

因此,如果我从客户端向服务器发送两个数据包,那么 recvfrom() 将读取第一个数据包并打印其数据,然后它将不断地一遍又一遍地读取第二个数据包。

据我了解,一旦执行了成功的读取操作,就应该从套接字中删除数据包,但这似乎并没有发生。

我知道客户端不会重新发送数据这一事实,因为每当客户端发送数据时都会写入控制台输出。

这是发件人的功能

使用此循环调用它,该循环针对其给定值运行两次。

以及接收功能

从服务器使用此循环调用

永远运行的输出(因为它不断重新读取最后一个数据包)是:

0 投票
2 回答
1802 浏览

python - 等待 X 秒以接收 UDP 数据包 Python

我正在用 Python 做一个客户端,他注册到服务器中。该客户端向服务器发送一个 UDP 数据包register并等待register accepted来自服务器的响应数据包。

有一些数据包丢失的可能性,因为它是 UDP,所以我需要代码:

发送数据包并等待5秒响应,如果没有收到数据包,则再次发送数据包然后等待10秒,如果已经没有响应,现在等待15秒,如果再次没有响应,则中断循环。

我的问题是要接收我正在做的数据包:

rcvfrom 是一种阻塞方法。我进行了搜索,我认为使用select我可以知道何时收到数据包然后读取套接字并获取它,但我不知道该怎么做,我找不到select简单的例子来说明我在做什么。

有人可以给我一些帮助吗?

谢谢!

0 投票
0 回答
1640 浏览

c++ - c++ udp 10038 在 sendto() 上的套接字错误

我在 sendto() 调用中收到 10038 套接字错误。这可能是什么原因造成的?在套接字创建或绑定时我没有收到任何错误。这是我设置套接字的方法:

开放端口

prepare_peer_connection

带有 sendTo() 调用的函数导致 10038

0 投票
4 回答
5365 浏览

c - C 套接字发送 UDP 并处理来自路由器的 ICMP 回复

我正在尝试将 UDP 数据包发送到生存时间为 1 的路由器,然后接收 ICMP 超时回复。到目前为止,我能够发送数据包,但是当我的程序进入执行的 recv 部分时,它只是挂起。我对 recvfrom 进行了错误检查,但它甚至没有做到这一点。我的电脑正在接收请求。我知道这一点是因为我在运行程序时运行 Wireshark 并过滤 ICMP 请求。每次我运行程序,我都会收到回复。recvfrom 我做错了什么?