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

时间:2013-09-27 14:52:24

标签: c++ sockets blocking winsock2

关于我心爱的插座的另一个问题。 我先解释一下我的情况。在那之后我会告诉你什么打扰我。

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

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

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

客户看到的完美沟通:

Send Data
Recv Data
Send Data
Recv Data
...

这是100帧的情况。

但是每隔几帧,流就冻结了4帧,然后继续。 (4帧就像500毫秒)

这个问题,我正面临着。

流的内容如下:

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,则无法解决问题。

我知道很难用这种见解来解决这个问题。我很高兴,如果你能分享你的知识,那么我可以自己解决它。

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

2 个答案:

答案 0 :(得分:1)

阻塞发送意味着套接字发送缓冲区已满,这意味着(a)接收器上的套接字接收缓冲区已满,这意味着接收器的读取速度不如您发送的速度快;或者(b)网络损失导致发送方重试。在任何一种情况下,你都无法在发送端做任何事情。

有人必须提到非阻塞I / O作为解决方案,但事实并非如此:在阻塞发送方阻塞的地方,非阻塞发送方将从send()获得-1,女巫'errno = = EAGAIN / EWOULDBLOCK',它根本无法解决实际问题。

答案 1 :(得分:0)

好吧。这绝对是一个wlan问题。我在我的大学测试了eduroam wlan。我不知道,如果有人知道的话。现在我用一个简单的路由器测试它,它工作正常。似乎eduroam wlan确实在带宽或方向变化方面遇到了一些麻烦。我不会考虑那个......