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

c++ - Recvfrom 重读旧数据

我正在使用 Berkeley C 套接字在 C/C++ 中编写一个实时网络系统,它在基于滴答的时间间隔上工作。每次滴答,客户端程序都会使用 recvfrom() 从套接字读取数据。

问题是如果服务器没有发送任何数据,客户端将读取在套接字上发送的最后一个数据。

例如客户端(伪代码)

和服务器:

然后客户端会继续打印“你好”,而我只需要它打印一次。

这与这个问题很相似,recvfrom re-reading data on socket ,但我不太明白答案,它似乎更普遍地解决了问题。

我猜数据存储在网卡上的缓冲区中,在这种情况下,在读取 1 次后是否可以清除缓冲区?我想到的另一种方法是对数据包进行编号并且只读取新的数据包,但是所有类型都是有限的,所以我希望可能有一种更清洁的方法。

我将如何做到这一点,以便客户端只读取一次接收到的数据?

0 投票
1 回答
99 浏览

ios - iPhone/iOS 上 recvfrom 的性能

我正在开发一个速度绝对至关重要的应用程序。我们通过专用 wifi 使用 UDP 连接(没有公共互联网,同一个房间 wifi)。

一般来说,一个 wifi 连接应该能够在不到 1 毫秒的时间内提供一个 512 字节的数据包。出于某种原因,在我们的案例中,recvfrom 需要 2.5-4.5 毫秒,直到我们得到包。

我已经完成了所有的挖掘和研究,以尽可能优化连接设置。(接收门槛等)

有没有人遇到过类似的问题或知道如何解决这个问题?我意识到,作为智能手机,网络层面发生了很多事情,但在这种情况下,我们甚至尝试了飞行模式,但仍然遇到同样的问题。

我会切换到 RAW 套接字,但 Apple 不允许这样做 - 所以我们需要解决这个问题。

我很感谢任何想法!

最好的,拉尔夫

0 投票
1 回答
2710 浏览

python - 如何检查 python 套接字 recvfrom() 数据

我正在使用 python 进行套接字编程。使用 ESP python,我创建了一个到服务器的套接字并发送请求(以 API 数据包格式,根据服务器代码它将响应)。在接收套接字时,我需要检查数据(如果接收到数据,则需要继续下一个操作。如果没有,我需要再次发送请求)。发送没问题。在接收套接字时,如果它没有接收数据,它不会进入下一条指令..请帮帮我。

代码:

发送数据:

在接收:

在上面的接收语句中,如果recvfrom()没有得到任何数据,如何检查recvpack并返回下一步操作..如果socket.settimeout()或者socket.setblocking()是解决方案,如何使用这些..

0 投票
1 回答
3389 浏览

c - recvfrom() 返回缓冲区的大小而不是读取的字节数

在准备我第一次编写 UDP 代码时,我正在尝试从这里复制和轻微修改的一些示例客户端和服务器代码。一切似乎都在工作,除了 recvfrom() 返回的值始终是缓冲区的大小而不是读取的字节数(如果我更改缓冲区大小并重新编译,报告的字节接收更改以匹配新的缓冲区大小虽然在每个测试中发送的字节都是相同的 10 个字节)。

是否有人在此代码中看到任何可以解释问题的错误(为简洁起见,此处删除了一些错误检查)?如果相关,我正在运行 Yosemite 10.10.5 的 Macbook Pro 上的终端窗口中的 bash 中编译和运行:

0 投票
1 回答
170 浏览

python - Windows 上 C 中的 recvfrom 函数在使用 MinGW 时跳过 UDP 数据

我无法解决 Windows 上的 recvfrom 功能问题。
请参阅我编写的代码的以下部分。我在 Linux 和 Windows 上运行此代码,并在 udp 比特率值中得到不同的结果。

在 Windows 上使用 Cygwin 编译它时,我得到与在 Ubuntu 上相同的结果,没关系。我将此与参考工具进行了比较。

当使用 MinGW 在 Windows 上编译它时,我得到更小的 upd 比特率值,这是由于一秒内的 while(1) 循环迭代次数较少(计数器变量)以及相关的 - 在 1 秒内捕获的数据量较少(data_in_1_sec多变的)。在 Windows 上使用 MinGW 的 recvfrom 功能似乎最慢,并且会跳过 udp 数据。
请注意,如果使用 MinGW,两个操作系统上的 upd 比特率大约为 0.200 Mbps,结果是相同的。在 UDP 比特率约为 20 Mbps 的数据上可以看到问题。

不幸的是,我不得不使用 MinGW,因为该代码作为静态库加载到 Python 代码中。使用 CygWin dll 我在 Python 下运行此函数时遇到访问冲突。

如何处理?

我使用的是 Windows 7 Professional 64。

我使用的代码:

此代码的结果,
对于 Windows:

相同数据的 Ubuntu 输出

0 投票
2 回答
5341 浏览

c++ - C++ recvfrom 超时

我需要实现以下行为:当服务器启动时,它应该使用广播检查现有服务器。然后它等待答案。

但是,如何设置等待超时?

0 投票
0 回答
238 浏览

sockets - socket udp 多个单播接收线程(reuseaddr/port)

使用 REUSEADDR/REUSEPORT 可以在一台机器上创建 2 个绑定到相同地址和端口的相同套接字。是否可以在 2 个套接字上接收相同的数据?

我的情况是定义的 udp 端口​​号将在网络上生成数据。在我的机器中,我在 2 个线程中有 2 个协议实现,我希望能够直接从套接字 api 使用该数据。

谢谢

问候托马斯

0 投票
1 回答
401 浏览

python - 多个套接字连接时的 recvfrom() 行为

我一直在处理一个将数据包发送到自身的其他副本的程序,而 recvfrom 的行为方式我并不完全理解。程序的每个实例都设置在不同的端口上(知道其他实例的端口号已经存储在 dictMap 字典中)。这个想法是,在我启动了这个程序的多个实例(比如 8 个)之后,它们都应该每秒相互 ping 3 次(MINI_UPDATE_INTERVAL)。

但是,如果我在一大堆正在运行的情况下关闭其中一个实例,则程序都会继续打印“检测到丑陋的断开连接等”。多次,即使断开连接的实例只断开了一次。这背后的原因是什么?我的部分代码如下:

编辑:问题似乎只发生在 Windows 上(其中 WSAECONNRESET 在断开连接后不断弹出)。由于我的代码最终是为 linux 设计的,我想这没什么大不了的。

0 投票
2 回答
66 浏览

c - 直接在函数上传递 sizeof() 和先前声明和初始化的变量有什么区别?

例如,我想知道是否有任何显着差异或好的/坏的做法

这样做:

这样:

0 投票
1 回答
513 浏览

linux - recvfrom() 在收到 udp 数据包时解除阻塞,但返回 0 作为读取字节的大小(使用 oscpack)

这是一个使用套接字在应用程序之间创建一些临时进程间通信的测试。这些应用程序稍后将在不同的系统上运行,使用定制的嵌入式通信系统,但目前后者不可用。因此,我正在寻找一种快速(甚至可能有点脏)的 c++ 方法来实现这些应用程序之间的进程间通信。应用程序将发送一些字符串(所以没什么太花哨的)。

我偶然发现了oscpack,它udp用于实现开放式声音控制的消息传递。我已经在 linux 中将它编译为 gcc4.7.1 作为共享对象,使用make lib. 请注意,我必须-fPIC在.COPTSMakefile

有了共享库,我编写了一个小的概念验证应用程序,它使用一个单独的线程来监听消息,并在主线程中等待某个字符串stdin将其转发到另一个应用程序。我执行此应用程序的 2 个非常相似的实例。只是在第二种情况下,我交换了PORT_RCVPORT_SND数字。


实际问题从这里开始:

我面临的问题是,在接收端,当对osc::UdpSocket::ReceiveFrom()(最终运行 recvfrom())的调用解除阻塞时,我得到的读取字节的返回值等于零 (0)。此外,char * data指针仍指向零。所以本质上我没有收到来自发送者应用程序的字符串,即使 recvfrom() 在正确的时间解除阻塞。

从手册页中我读到,当发送方关闭连接时,recv 和 recvfrom 可以返回值 0。但在这种情况下,发件人使用的是 udp,即无连接...连接:),所以我不确定它是否适用于此。

我尝试使用netcat在相应端口中侦听 udp 消息并验证至少发送方部分是否有效。事实上netcat -u -l -p <sender port of the running instance>,我确实收到了我输入的消息。所以问题可能与接收端有关。

问题是:我是否正确使用了 recvfrom ?


请找到附加到进程间通信测试应用程序的代码(实际上是一个全双工信使)。要执行其中的两个,首先下载并编译为库oscpack库。然后将下面的源代码复制到两个文件中,并交换第二个源文件中的PORT_RCVPORT_SND数字。

然后编译每个:

然后执行它们并输入一个单词,按 Enter 并期望(不)看到它出现在其他应用程序中。