當套接字連接已被髮件人正常關閉時,我試圖通過網絡獲得0的值,如指定here。當我使用非阻塞呼叫時,在數據從發送方發送到接收方之前,我在UDP流中獲得了-1。原始數據發送完畢並關閉連接(嘗試關閉套接字並關閉發送方的套接字)後,我仍然得到-1而不是0,表示套接字已關閉。任何人都可以請求幫助,有什麼辦法可以得到同樣的結果。如何在關機調用後的UDP recvfrom()調用中返回0的返回值。
謝謝。
當套接字連接已被髮件人正常關閉時,我試圖通過網絡獲得0的值,如指定here。當我使用非阻塞呼叫時,在數據從發送方發送到接收方之前,我在UDP流中獲得了-1。原始數據發送完畢並關閉連接(嘗試關閉套接字並關閉發送方的套接字)後,我仍然得到-1而不是0,表示套接字已關閉。任何人都可以請求幫助,有什麼辦法可以得到同樣的結果。如何在關機調用後的UDP recvfrom()調用中返回0的返回值。
謝謝。
當UDP套接字close(2)
-ed有沒有發送出去,即使套接字是connect(2)
-ed。另一方面,TCP啓動four-way connection tear-down。看起來你混淆了這兩種情況。
UNIX手冊頁關機states如下:
返回值:
如果成功,則返回零。出錯時,返回-1, ,並適當地設置errno。
錯誤:
EBADF - 的sockfd是不是一個有效的描述符。
ENOTCONN - 指定的插座未連接。
ENOTSOCK - sockfd是一個文件,而不是套接字。
和Windows平臺have不盡相同:
返回值
如果沒有出現錯誤,關閉返回零。否則,將返回值 SOCKET_ERROR,通過調用WSAGetLastError可以檢索到一個特定的錯誤代碼 。
問題是:UDP不是面向連接的協議,connect()調用它並不意味着任何關聯都被建立。
所以我的猜測,你實際上得到ENOTCONN錯誤(或WSAENOTCONN,如果你使用的是Windows) 檢查錯誤號(或Windows WSAGetLastError())
你能顯示你的代碼嗎? –
沒有UDP套接字連接的概念 – 2012-11-28 15:06:50
@aleguna是的,那很好,但是如文檔中提到的那樣,從recvfrom()得到返回值0的機制是什麼。 – cbinder