我正在使用Windows套接字爲我的應用程序(winsock2.h)。由於阻塞套接字不讓我控制連接超時,所以我使用了非阻塞套接字。在發送命令之後,我正在使用shutdown命令來刷新(我必須)。我的超時時間是50ms,我想知道的是如果要發送的數據如此之大,是否存在僅發送一部分數據或根本不發送任何信息的風險?在此先感謝...發送後非阻塞TCP套接字和沖洗?
hSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
u_long iMode=1;
ioctlsocket(hSocket,FIONBIO,&iMode);
connect(hSocket, (sockaddr*)(&sockAddr),sockAddrSize);
send(hSocket, sendbuf, sendlen, 0);
shutdown(hSocket, SD_BOTH);
Sleep(50);
closesocket(hSocket);
嗯,我敢肯定的是,連接超時工作的很好的阻止套接字以及 - 我該做的客戶端線程內所有的時間 - 如果斷開連接,循環輪connect()的嘗試和睡眠(2000 ),不斷重試連接,直到一個成功。連接超時反正是不相關的connect()成功後,插座寫,所以我假定你的意思寫超時的一種形式?如果是這樣,我從來沒有嘗試過這樣的事情 - 我不使用連接/斷開連接協議(除了瀏覽器/ HTTP!),因爲性能不佳(特別是在高延遲鏈接上)。 – 2012-07-15 10:47:22
您可以使用select()超時阻塞模式連接。您不必調用shutdown()來刷新。 TCl不會丟失數據,否則互聯網將無法工作,例如這個論壇,亞馬遜,谷歌等。你的問題是基於假前提。 – EJP 2012-07-15 10:59:51
您是「選擇」插座狀態並檢查斷開連接嗎?我想盡可能快地發送數據。另外兩種可能的情況是:服務器等待時間過長以接受連接或接收。所以連接和寫作都應該在最長50ms內完成,因爲時間對我而言非常重要。我必須同時刷寫寫入和讀取流,因爲服務器不斷向我發送不必要的大數據,並且我的網絡連接有限。事實上,我甚至不希望從服務器:) – theGD 2012-07-15 11:00:56