0

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

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

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

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.

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

由于无线局域网不是双工的(据我所知),我认为发送呼叫由于某种原因被优先考虑。之后 Receive 调用被优先处理,因此 send 调用阻塞,直到 recv 调用完成。

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

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

编辑:它完全没问题,如果客户端 recv 挂了一点。但它不能阻止发送。服务器不断需要数据。

4

2 回答 2

1

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

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

于 2013-09-28T00:02:03.903 回答
0

那好吧。这绝对是一个wlan问题。我在我的大学测试了 eduroam wlan。不知道有没有人知道 现在我用一个简单的路由器对其进行了测试,它运行良好。似乎 eduroam wlan 在带宽或方向变化方面确实存在一些问题。我不会调查那个...

于 2013-10-17T12:53:12.483 回答