2012-11-28 10 views
1

當套接字連接已被髮件人正常關閉時,我試圖通過網絡獲得0的值,如指定here。當我使用非阻塞呼叫時,在數據從發送方發送到接收方之前,我在UDP流中獲得了-1。原始數據發送完畢並關閉連接(嘗試關閉套接字並關閉發送方的套接字)後,我仍然得到-1而不是0,表示套接字已關閉。任何人都可以請求幫助,有什麼辦法可以得到同樣的結果。如何在關機調用後的UDP recvfrom()調用中返回0的返回值。

謝謝。

+1

你能顯示你的代碼嗎? –

+1

沒有UDP套接字連接的概念 – 2012-11-28 15:06:50

+0

@aleguna是的,那很好,但是如文檔中提到的那樣,從recvfrom()得到返回值0的機制是什麼。 – cbinder

回答

1

UNIX手冊頁關機states如下:

返回值:

如果成功,則返回零。出錯時,返回-1, ,並適當地設置errno。

錯誤:

EBADF - 的sockfd是不是一個有效的描述符。
ENOTCONN - 指定的插座未連接。
ENOTSOCK - sockfd是一個文件,而不是套接字。

和Windows平臺have不盡相同:

返回值

如果沒有出現錯誤,關閉返回零。否則,將返回值 SOCKET_ERROR,通過調用WSAGetLastError可以檢索到一個特定的錯誤代碼 。

問題是:UDP不是面向連接的協議,connect()調用它並不意味着任何關聯都被建立。

所以我的猜測,你實際上得到ENOTCONN錯誤(或WSAENOTCONN,如果你使用的是Windows) 檢查錯誤號(或Windows WSAGetLastError())

+0

你已經談到了shutdown()返回代碼,但是我想要的是關閉套接字的關閉或關閉,我應該從recvfrom()調用返回代碼0,因爲套接字描述符不再存在於發送方。 – cbinder

+0

@javabinder他正在談論它,你一直忽略它。如果你已經*檢查了shutdown()的返回碼,你應該會發現它沒有成功。 – EJP

+0

@EJP將檢查相同.. :) – cbinder