2010-01-11 51 views
0

我面臨着與插座有問題,我會很高興,如果你能幫助...
的問題是,當我發送不止一次它會阻止更多的數據,如:爲什麼當向套接字寫入多次時,它會阻塞?

//--- client --- 
//.. 
send(sock, buf_1, sizeof(buf_1), 0); 

for (x10){ 
//... 
send(sock, buf_2, sizeof(buf_2), 0);  
if (recv(sock, buf_2, sizeof(buf_2), 0)<0) printf("recv_2() failed"); 
//... 
} 

for (x20){ 
//... 
send(sock, buf_3, sizeof(buf_3), 0);  
if (recv(sock, buf_3, sizeof(buf_3), 0)<0) printf("recv_3() failed"); 
//...  
} 
//...   

//--- server--- 
//... 
if (recv(sock, buf_1, sizeof(buf_1), 0)<0) printf("recv_1() failed"); 

for (x10){  
if (recv(sock, buf_2, sizeof(buf_2), 0)<0) printf("recv_2() failed");  
//...  
send(sock, buf_2, sizeof(buf_2), 0);  
}  

for (x20){ 
if (recv(sock, buf_3, sizeof(buf_3), 0)<0) printf("recv_3() failed"); 
//...  
send(sock, buf_3, sizeof(buf_3), 0);  
}  
//... 

交換塊剛在第一個send()之後,有什麼想法嗎?
udp是否支持多個sendto()

感謝您的回答 -

+0

如果要異步發送,請使用異步調用。 – 2010-01-11 03:42:22

+0

服務器似乎在recv()處被阻塞。打印第一個recv()得到的內容,並確保代碼實際到達服務器中的第一個send()。 – 2010-01-11 04:52:21

+0

感謝您的回覆。在第一次recv()之後,它會被阻塞。沒有錯誤顯示 – Apollo 2010-01-11 13:08:54

回答

3

在這種情況下send和recv都被阻塞。 您需要在套接字上設置異步標誌(O_NONBLOCK,我認爲 - 請參閱fnctl的文檔)。 但是,這可能是棘手的,以得到正確的。如果你不發送/獲取所有的數據,你必須保持調用send/recv,直到你完全掌握了所有的數據,並且有效地這樣做意味着你將不得不在你的套接字上使用select系統調用。

現在所有這些都是非常可行的,但調試起來並沒有多少樂趣和痛苦。 我建議你嘗試boost :: asio(異步io)庫,而不是玩原始套接字。 http://www.boost.org/doc/libs/1_41_0/doc/html/boost_asio.html

+0

謝謝!問題不在於異步發送/接收,而是同步 – Apollo 2010-01-11 13:10:12

1

UDP或TCP?

如果TCP;您發送的數據有多大?客戶在做什麼?客戶端是否實際接收和處理第一塊數據?可能發生的情況是第二次發送呼叫被阻塞,因爲你的客戶端的接收窗口已滿並且TCP堆棧已經進行流量控制,這會導致你的同步發送阻塞,等待對方讀取足夠的數據,以致recv窗口不是充分和流量控制的情況已經過去了......

還要注意的是,如果你處理TCP那麼recv的調用可以將返回任意數目的字節在1和你發送的字節數之間;你應該總是循環累加你的消息幀告訴你需要的字節數...

你提到,在你的問題的最後,關於UDP和多個sendTos,這與你的問題有什麼關係?事實上,你在這裏使用UDP套接字嗎?

+0

謝謝!此時,我正在使用TCP,並在第一次recv後阻塞。服務器只收到buf_1並停止,而客戶端不做任何事情。我也設想爲這個應用程序使用UDP。 – Apollo 2010-01-11 17:59:26

+0

你的問題仍然非常模糊,但如果'服務器'註釋之後的代碼在第一次recv之後阻塞(這就是你的建議),那麼完全可以預料,因爲recv將返回儘可能多的字節。正如我在上面的回覆中所說的,您需要更好地管理您的recv呼叫;你的代碼,因爲它的所有數據可能被第一recv讀取... – 2010-01-11 20:00:46

+0

對不起,問題不是模糊的,但技術... 感謝您的答案無論如何... – Apollo 2010-01-23 21:55:13