发送/接收套接字阻塞问题

Send/Recv Socket Blocking Issues

本文关键字:问题 套接字 发送      更新时间:2023-10-16

另一个关于我心爱的插座的问题。我将首先解释我的情况是什么。之后,我会告诉你困扰我的事情。

我有一个客户端和一个服务器。这两个应用程序都是用 winsock2 实现C++编写的。连接通过 TCP 和 WLAN 运行。WLan 非常重要,因为它可能会导致问题,并且肯定会成为通信渠道。

我正在将两个套接字连接到服务器。一个 SendSocket 和一个 ReceiveSocket。我不断通过发送套路将视频数据发送到服务器。数据被处理并发送回客户端并显示。每个插座都有自己的线程。

视频数据是编码的,所以我实现了500kB/s。 让我们看到这个速率是固定的,没有解释。

客户看到的完美沟通:

Send Data
Recv Data
Send Data
Recv Data
...

这是大约 100 帧的情况。

但是每隔几帧,流就会冻结大约 4 帧,然后继续。(4帧就像500ms(

这就是我面临的问题所在。

流发生的情况如下:

Send Data
Recv Data
Send Data
Send Data
Send Data1 -> blocked send
Recv Data
Recv Data
Send Data2 -> not blocked anymore.

数据在服务器端正确发送。

由于WLan不是双工的(据我所知(,我认为,出于某种原因,发送呼叫是优先的。之后,接收呼叫被优先考虑,因此发送呼叫会阻止,直到 recv 呼叫完成。

也许你可以告诉我,下层发生了什么,这可能会导致问题。顺便说一句。我肯定不确定,如果它不仅仅是带宽问题,但我认为 WLAN 应该能够处理 500kB/s。这 500kB/s 同时是上游和下游。重要提示:如果我将帧速率设置为 1/5 倍,则无法解决问题。

我知道很难用这种洞察力解决这个问题。如果您能分享您的知识,我会很高兴,所以我也许可以自己修复它。

编辑:如果客户收到挂了一个点子,它完全没问题。但它绝不能阻止发送。服务器需要持续的数据。

阻塞发送意味着套接字发送缓冲区已满,这意味着 (a( 接收器处的套接字接收器缓冲区已满,这意味着接收器的读取速度不如您发送的速度快; 或者 (b( 存在导致发送方重试的网络丢失。无论哪种情况,您都无法在发送端对此执行任何操作。

有人一定会提到非阻塞 I/O 作为一种解决方案,但事实并非如此:在阻塞发送方阻塞的点上,非阻塞发送方将从 send(( 女巫 'errno == EAGAIN/EWILLBLOCK' 获得 -1,这根本无法解决实际问题。

好吧。这绝对是一个WLAN问题。我在大学里测试了eduroam wlan。我不知道,如果有人知道的话。现在我用一个简单的路由器测试了它,它工作正常。似乎eduroam wlan确实在带宽或方向更改方面存在一些问题。我不会调查那个...