问题标签 [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.
python - Python recvfrom 缓冲区太慢了
我使用的是预编码脚本,因为我是 Python 菜鸟,在套接字编程方面遇到了一些麻烦。
我使用两台计算机,一台正在运行 Matlab/Simulink 实时应用程序,它通过 UDP 向我的 Windows 笔记本电脑发送数据。数据包含光标和目标的 XY 坐标、目标半径和颜色(总共 6 个信号)。在笔记本电脑上,我正在运行一个 python 脚本,理想情况下,它会读出 udp 信号并在辅助屏幕上实时(或接近实时)在给定坐标处绘制椭圆。不幸的是,执行速度可能不足以跟上以 1000Hz 发送的 UDP 信号。这导致在发送信号的变化与屏幕上显示之间存在大约 40 秒的巨大延迟。
如果我是正确的,那么问题出在 recvfrom 命令中。接收到的数据存储在某种缓冲区中,并以 FIFO 样式显示,而不是以 1000Hz 实时显示所有内容。问题是我不知道如何解决这个问题。大多数关于套接字编程的解释都超出了我的想象。它不需要以 1000Hz 显示,50Hz 就可以了,但尽快显示更改会非常好。而不是 FIFO,我只想读取最后收到的数据。
谁能帮我吗?先感谢您。
c++ - 如何确定有多少套接字接收缓冲区被填满?
在我的应用程序中,我试图尽快向不同的服务器发送和接收数据报。我注意到提高发送速率会大大降低我收到的给定发送数的响应百分比。我相信一个原因可能是 recvfrom() 的队列填充速度比我调用函数读取数据包的速度要快,到达终点并丢弃大量数据包。有没有办法检查套接字的接收缓冲区有多满?
这是在 Windows 上,而不是在 Linux 上,我更喜欢编程方法。
c - 为什么 recvfrom 在 UDP 消息上存储 0.0.0.0 的 IP 地址?
我正在读取 recvfrom() 的“from”参数中存储的 0.0.0.0 的 IP 地址,但我不知道为什么。消息通过就好了,并且有一些信息存储在“fromSockAddrIn”中。
代码:
Check_Print_Error:
python程序发送消息:
我的输出:
谢谢你的帮助。
c - 使用 SOCK_DGRAM 时使用 recvfrom 接收空有效负载?
recvfrom()
是否可以使用SOCK_DGRAM
基于套接字的方式接收任何空有效负载?服务器只对客户端标头感兴趣,以便将其发回一条消息(即单个消息,仅发送协议)。
c - recvfrom 用零填充缓冲区
我正在尝试通过 udp 实现距离矢量路由。我有以下结构:
所以数据包是 1 字节类型,1 字节版本,2 字节更新计数,然后是 4*更新计数字节的数据。我正在使用灵活的数组成员,这样我就可以做到
并在一个数据包中发送整个内容。需要发送一个数据包。我能够使用wireshark 验证数据是否正确发送。在接收端,我做了两个接收。第一个获取前 4 个字节,因此我可以知道需要多少更新。然后我相应地调整接收器缓冲区的大小并接收 4*num_updates 字节。问题是第二次接收用零填充我的缓冲区!如果我期望 12 个字节的数据,我会得到 12 个字节的零。下次我从该套接字读取时,我会按预期获得下一个数据包的开头。为什么会发生这种情况?
如果需要,这是我的接收代码。
c - 为什么 recvfrom 关心数据来自谁
所以,我正在用 C 语言创建一个使用 UDP 的服务器,并且我想监听来自许多来源的传入数据包。因此,当我调用 时ssize_t recvfrom(int, void *, size_t, int, struct sockaddr * __restrict, socklen_t * __restrict)
,包含发送者信息的第 5 个参数可能会有所不同。
有没有办法在不知道每个客户地址信息的情况下接收数据包?而且,这对 C 的库有可能吗?
这是我的代码:
我注意到当使用 Java 的 DatagramSocket 和 DatagramPacket 类接收数据时,DatagramSocket 的receive
函数接受了一个 DatagramPacket 类型的参数。然而,这个 DatagramPacket 只保存放置数据的对象。那么,为什么 C 实现 UDP 接收需要知道发送者的信息呢?
c++ - 因使用警报()而陷入超时循环;
我正在尝试实现 GoBackN 协议,当服务器丢弃数据包时,我的警报会等待 2 秒,然后再发送所有先前发送的数据包。
警报工作并等待 2 秒,但是在第一次超时后,我正在使用的状态机陷入循环并继续超时。我认为这可能是因为errno
没有重置,但我不确定。
我怀疑循环开始的位置在该receiveData
州。
sockets - 是否可以仅从指定的源地址接收 UDP 数据包?
我知道recvfrom
可以通过指针参数返回源地址,这样我就可以检查接收到的数据包是否来自我感兴趣的地址。除了在已经接收到数据包后检查源地址之外,还有其他方法吗?