2009-08-03 45 views
10

我已閱讀boost asio參考,閱讀了教程並查看了一些示例。不過,我無法看到一個插座應該如何拆除:應該怎麼拆掉boost :: asio :: ip :: udp :: socket?

  1. 我應該調用close()還是通過套接字的析構函數完成?
  2. 什麼時候應該關機()
  3. shutdown()有什麼影響? 我知道它「禁用發送或接收」,但這是如何完成的?如果在禁用之後使用套接字發送或接收,我可以期待什麼?
  4. 哪些錯誤可我從接近()預計

回答

10

由於這是一個多問題,我會盡我所能回答每一個部分,讓您滿意:

1)這是我的經驗使用ASIO套接字,析構函數處理關閉套接字。不過,我只處理了TCP套接字。檢查這個的最好方法是簡單地查看析構函數的代碼,看它是否有類似於close的任何事情。我知道Boost代碼可能有點棘手,所以簡單地創建一個打開UDP套接字然後破壞它的小示例程序可能是最簡單的。這樣你就可以在調試器中遍歷代碼來遵循邏輯。

由於Boost的設計者考慮到了TCP套接字,所以我很難想象它們對於UDP套接字不會這麼做。

2)僅當您覺得有必要防止任何代碼在插座上執行將來的recv和/或send時,才致電shutdown()。這通常不是必需的,儘管我已經看到它在TCP套接字上用來強制套接字在關閉時發送一個RST(與處理未決發送時的默認「優雅」關閉相反)。

3)您可以將套接字視爲雙通道通信形式:一個用於讀取,另一個用於發送。您可以關閉其中一個,另一個可以在另一個關閉的情況下繼續使用一個通道(即關閉後可繼續接收,反之亦然)。關閉套接字與在recv和send上調用shutdown完全相同。

關閉recv只會阻止您的代碼讀取更多數據。如果你試圖這樣做,你會得到一個套接字錯誤。同樣,如果連接的另一端嘗試向您發送數據,它將收到一個錯誤(很抱歉,請再次切換到TCP世界,但我相信RST會被回覆給發件人)。

關閉發送同樣會阻止您的代碼發送更多數據。如果內存正確地爲我服務,這看起來與關閉套接字時發生的情況完全相同(零長度的數據包被髮送以通知另一方特定通道已關閉)。任何未來嘗試發送都將返回錯誤。

4)您必須檢查您的文檔以確定。 MSDN會給你一個很好的指示,但我不知道我會認爲它是權威的。

+0

謝謝,我也想通了一些這方面,但我仍不能確定是否關閉()真的是所謂的插座的析構函數。我真正沒有注意到的是boost asio和傳統網絡編程之間的緊密聯繫。你對shutdown()的解釋和查看msdn套接字錯誤代碼的建議都表明了這一點。 +1 – Torleif 2009-11-10 20:53:24

1

從Boost網站上給出的例子看來,您應該簡單地使用close()。例如,看這一個:

 
void connection::stop() 
{ 
    socket_.close(); 
} 

從這個地址摘自:HTTP Server

相關問題