2013-09-27 44 views
0

關於我心愛的套接字的另一個問題。 我會先解釋一下我的情況。之後,我會告訴你什麼困擾我。發送/接收套接字阻塞問題

我有一個客戶端和一個服務器。這兩個應用程序都是用C++編寫的winsock2實現。連接在TCP和WLAN上運行。 WLan是非常重要的,因爲它可能引起問題,並且肯定會成爲通信渠道。

我將兩個套接字連接到服務器。一個SendSocket和一個ReceiveSocket。我經常通過發送器將視頻數據發送到服務器。數據被處理並被髮送回客戶端並被顯示。每個套接字都有自己的線程。

該視頻數據編碼,所以我達到像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不是雙工的(據我所知),我認爲發送呼叫因爲某種原因被優先處理。之後,接收呼叫優先,所以發送呼叫阻塞直到接收呼叫完成。

也許你可以告訴我,底層發生了什麼,這可能會導致問題。 Btw。如果它不僅僅是帶寬問題,我肯定不確定,但我認爲WLAN應該能夠處理500kB/s。這500kB/s同時在上游和下游。 重要通知:如果將幀率設置爲1/5的因子,則不能解決問題。

我知道很難用此洞察解決此問題。如果你能分享你的知識,我會很高興,所以我可以自己修復它。

編輯:它非常好,如果客戶端recv掛起litte。但它不能阻止發送。服務器需要連續的數據。

回答

0

好吧。這確實是一個無線局域網問題。我在我的大學測試了eduroam wlan。我不知道,如果有人知道的話。現在我用一個簡單的路由器測試它,它工作正常。似乎eduroam wlan在帶寬或方向更改方面確實存在一些問題。我不會考慮那個......

1

封端的發送意味着要麼套接字發送緩衝器是滿的,這意味着或者(a),該接收器處的插座接收器緩衝器是滿的,這意味着接收器沒有讀取的速度,您要發送;或者(b)網絡丟失導致發送者重試。無論哪種情況,在發送端都無法做到這一點。

有人會提到非阻塞I/O作爲解決方案,但它不是:在阻塞的發送者阻塞的位置,非阻塞的發送者將從send()中獲得-1 witch'errno == EAGAIN/EWOULDBLOCK',它根本不能解決實際問題。

+0

就像之前提到的那樣,我的確把幀率降低到了1/5,這並沒有改變任何東西。所以CPU應該足夠快地編碼/解碼,以保持接收緩衝區爲空。 – xeed

+0

事實上,當服務器收到包時,發送緩衝區不能滿。所以必須有另一個原因,爲什麼發送塊。 事情是。客戶端上的recv和send呼叫是併發的。那是什麼導致了這些街區,我的想法。 – xeed

+0

進一步進一步。當我不把圖像從服務器發送回客戶端時。沒有滯後。但是當我從服務器接收到一個IFrame(~16000Byte)時,它會阻止8!發送例程。所以8個幀被跳過。服務器發送呼叫仍立即返回。雖然這8個幀被阻塞,但服務器不會收到任何內容,也不會發送任何內容,客戶端也是如此。 (被阻止的接收除外) 這8個幀表示500ms ...你不能告訴我需要很長時間才能傳送15kB的WLAN ...... – xeed