繁体   English   中英

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

[英]Send/Recv Socket Blocking Issues

关于我心爱的插座的另一个问题。 我先解释一下我的情况。 之后,我将告诉您困扰我的事情。

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

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

Videodata已编码,因此达到了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不是双工的(据我所知),所以我认为,出于某种原因,发送调用被优先处理。 然后,对接收呼叫进行优先排序,因此发送呼叫将阻塞,直到完成接收呼叫为止。

也许您可以告诉我,下层正在发生什么,这可能会导致问题。 顺便说一句。 我绝对不确定,这不仅是带宽问题,而且我认为WLAN应该能够处理500kB / s。 此500kB / s同时位于上游和下游。 重要说明:如果将帧速率设置为1/5的因子,则不能解决问题。

我知道很难用这种见解解决此问题。 如果您可以分享您的知识,我将很高兴,因此我可以自己解决问题。

编辑:如果客户端Recv挂了一个小字,它就很好。 但是它一定不能阻止发送。 服务器连续需要数据。

发送阻塞意味着套接字发送缓冲区已满,或者(a)接收方的套接字接收方缓冲区已满,这意味着接收方的读取速度不如发送时快; 否则(b)存在导致发送方重试的网络丢失。 无论哪种情况,在发送端您都无能为力。

一定有人会提到非阻塞I / O作为解决方案,但事实并非如此:在阻塞发件人阻塞的那一刻,非阻塞发件人将从send()中获得-1巫婆'errno == EAGAIN / EWOULDBLOCK”,根本无法解决实际问题。

那好吧 这绝对是一个WLAN问题。 我在大学里通过eduroam wlan测试。 我不知道,是否有人知道。 现在,我用一个简单的路由器对其进行了测试,并且工作正常。 好像eduroam wlan确实在带宽或方向更改方面有些麻烦。 我不会调查...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM