2010-06-25 44 views
2

在我的應用程序中,我在同一套接字上調用shutdownclosesocket兩次函數。我知道這是不對的,我必須確保這些功能只被調用一次。但是爲什麼這些通話在第二次通話時都不會失敗?在同一個套接字上調用shutdown和closetsocket兩次

如果m_Socket手柄1500,然後將它的值是什麼時,shutdownclosesocket函數的調用就可以了?

shutdown(m_SocServer, 2); 
closesocket(m_SocServer); 

回答

7

首先,你必須區分兩種不同的東西:一個插座上

  1. 執行操作,其中一些可能使其在無法使用的狀態。
  2. 終止插座手柄。

調用參數爲shutdown(即SD_BOTH)爲(1)。也就是說,你刷新所有掛起的緩衝區,並放棄所有的接收緩衝區。這樣你就不能讀/寫了。但是你仍然擁有一個有效的套接字句柄。如果你願意,你仍然可以查詢/設置它的選項。例如,您可以撥打getpeername來發現您連接的地址。 另外,根據實施情況,再次調用shutdown不必導致錯誤。也許它有累積效應。

另一方面,呼叫closesocket是(2)。一旦你調用它 - 你不能對該套接字句柄做任何事情。現在它是無效的。

如果套接字的值爲1500,即使在致電closesocket後,它仍然具有該值。因爲它只是一個變量。這就像是在你delete之後問什麼值會有指針。

但是,此套接字值(1500)不再有效。您無法使用此值調用任何套接字函數。

此外,如果您同時創建另一個套接字 - 它很可能會收到相同的數字。在這裏,您可能會發現自己處於更嚴重的問題 - 在另一個套接字上執行操作而不會注意到它。

對於某些人來說,在您調用closesocket之後立即將INVALID_SOCKET的值賦值給套接字變量是一種很好的做法。

P.S. 也許調用shutdown + closesocket不會因爲您關閉另一個套接字而特別失敗。

1

他們確實失敗。嘗試下面的代碼片段。

SOCKET s = socket(AF_INET, SOCK_STREAM, 0); 
closesocket(s); // OK 

shutdown(s, 2); // fails 
closesocket(s); // fails 
5

無論你得到一個錯誤或者不調用closesocket後的第一時間取決於你的代碼的其餘部分正在做什麼。

一旦你呼叫closesocket,該套接字標識符是空閒的,並且可以通過對socket的另一個調用再次返回。如果你再打電話closesocket,你不關閉你的原始套接字,但重新開放的一個

相關問題