在我的應用程序中,我在同一套接字上調用shutdown
和closesocket
兩次函數。我知道這是不對的,我必須確保這些功能只被調用一次。但是爲什麼這些通話在第二次通話時都不會失敗?在同一個套接字上調用shutdown和closetsocket兩次
如果m_Socket
手柄1500
,然後將它的值是什麼時,shutdown
和closesocket
函數的調用就可以了?
shutdown(m_SocServer, 2);
closesocket(m_SocServer);
在我的應用程序中,我在同一套接字上調用shutdown
和closesocket
兩次函數。我知道這是不對的,我必須確保這些功能只被調用一次。但是爲什麼這些通話在第二次通話時都不會失敗?在同一個套接字上調用shutdown和closetsocket兩次
如果m_Socket
手柄1500
,然後將它的值是什麼時,shutdown
和closesocket
函數的調用就可以了?
shutdown(m_SocServer, 2);
closesocket(m_SocServer);
首先,你必須區分兩種不同的東西:一個插座上
調用參數爲shutdown
(即SD_BOTH
)爲(1)。也就是說,你刷新所有掛起的緩衝區,並放棄所有的接收緩衝區。這樣你就不能讀/寫了。但是你仍然擁有一個有效的套接字句柄。如果你願意,你仍然可以查詢/設置它的選項。例如,您可以撥打getpeername
來發現您連接的地址。 另外,根據實施情況,再次調用shutdown
不必導致錯誤。也許它有累積效應。
另一方面,呼叫closesocket
是(2)。一旦你調用它 - 你不能對該套接字句柄做任何事情。現在它是無效的。
如果套接字的值爲1500,即使在致電closesocket
後,它仍然具有該值。因爲它只是一個變量。這就像是在你delete
之後問什麼值會有指針。
但是,此套接字值(1500)不再有效。您無法使用此值調用任何套接字函數。
此外,如果您同時創建另一個套接字 - 它很可能會收到相同的數字。在這裏,您可能會發現自己處於更嚴重的問題 - 在另一個套接字上執行操作而不會注意到它。
對於某些人來說,在您調用closesocket
之後立即將INVALID_SOCKET
的值賦值給套接字變量是一種很好的做法。
P.S. 也許調用shutdown
+ closesocket
不會因爲您關閉另一個套接字而特別失敗。
他們確實失敗。嘗試下面的代碼片段。
SOCKET s = socket(AF_INET, SOCK_STREAM, 0);
closesocket(s); // OK
shutdown(s, 2); // fails
closesocket(s); // fails
無論你得到一個錯誤或者不調用closesocket
後的第一時間取決於你的代碼的其餘部分正在做什麼。
一旦你呼叫closesocket
,該套接字標識符是空閒的,並且可以通過對socket
的另一個調用再次返回。如果你再打電話closesocket
,你不關閉你的原始套接字,但重新開放的一個