當使用TCP連接到一個“不存在”的埠的時候,有些服務器是可以讓你"連接成功"的,但之后會發送一個Reset報文;
例如,使用Winsock的connect試圖連接某服務器的8155埠(實際并沒有應用程式在這個埠上提供服務),程序如下:
Client -> Server:SYN
Server->Client:ACK SYN
Client->Server:ACK
Server->Client:ACK Reset
其實服務器那邊是因為根本沒有應用程式在這個埠上提供服務,服務器才會發回一個Reset報文。 那么,這個TCP已經是“事實上斷開”了。
但是,Winsock 的 connect 函式竟然可恥地回傳了成功,成功! 然后send 也是成功,成功!recv 竟然也不會有錯誤發生!只是Timeout。
然后,我翻遍了MSDN和百度,都不知道該如何處理這種情況; 現在發現Winsock似乎對這種情況是完全無視,你要send,它只管send(并且告訴你send成功了), send了幾次之后,發現服務器那邊無回應(ACK),Winsock 才覺醒過來,然后主動向服務器發送一個 ACK Reset, 這下,你再recv,就是回傳WSAECONNRESET錯誤!告訴你: An existing connection was forcibly closed by the remote host. 很搞笑好嘛? 因為服務器老早就告訴你reset了,你卻視而不見,非要自己發資料,發一次發現無ACK,又重發,再重發。然后,咦,服務器一直無ACK,這下才說連接被服務器強制關閉了。
uj5u.com熱心網友回復:
那你不用winsock,直接用sokcet API呢uj5u.com熱心網友回復:
光google或者百度搜索是沒什么意義的,這涉及到了底層的實作 tcp/ip 協議堆疊你明顯沒讀過tcp/ip 協議卷1-3
uj5u.com熱心網友回復:
百度搜索搜不到
《TCP-IP詳解卷一:協議》
《TCP-IP詳解卷二:實作》
《TCP-IP詳解卷三:TCP事務協議,HTTP,NNTP和UNIX域協議》
里面的內容?
uj5u.com熱心網友回復:
自己做一個心跳包,用于檢測。uj5u.com熱心網友回復:
這個應該不是WinSock的問題,WSAEventSelect 啟動 FD_CLOSE 事件, 等待關閉事件,
或者執行緒中 不斷 recv ,處理<=0的情況
uj5u.com熱心網友回復:
我懷疑你的理解能力,我說的是要詳細理解或者解釋為什么這樣,需要閱讀并理解tcp/ip底層的實作,
光搜索到內容有毛用?有幾個人肯花苦功夫去看這種大塊頭?
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/79671.html
標籤:網絡編程
下一篇:求問一個簡單呼叫方法
