原文:https://beej.us/guide/bgnet/html/#close-and-shutdownget-outta-my-face
5.9 close()和shutdown() ---別讓我再見到你的臉!
你已經整天都在發送(send()) 和接收 (recv()) 數據了,現在你準備關閉你的套接字描述符了。
這很簡單,你可以使用一般的 Unix 文件描述符的 close() 函數:
int close(sockfd);
它將防止套接字上的數據讀寫。
任何在另一端讀寫socket的企圖都將返回錯誤信息。
如果想在關閉套接字上有更多一點的控制,可以使用函數 shutdown()。
int shutdown(int sockfd, int how);
sockfd: 套接字描述符
參數how 值:
0 – 不允許接受
1 – 不允許發送
2 – 不允許發送和接受(和 close() 一樣)
shutdown() 成功時返回 0,失敗時返回 -1(同時設置 errno)
如果在UDP中使用shutdown(),那麼只不過是讓send() 和 recv() 不能使用;在使用了 connect() 後是還可以使用sockfd。
需要特別注意的是,shutdown()實際上並沒有關閉文件描述符,它只是改變了其可用性。 要釋放套接字描述符,您需要使用close()。