2012-10-27 36 views
0

我需要強制返回值read從套接字等於零沒有關閉連接。在C++中讀取socket返回值

我在一個頁面說法仔細閱讀以下聲明:

如果收到或連接被關閉檔案結尾的條件,則返回0。

但我不知道如何讓它在我發送的字符串後收到該條件。

任何人都可以幫忙嗎?

+1

你能解釋_爲什麼你想要這個?接收者怎麼知道接收到「read」呼叫的次數? –

+0

我想這使雙方可以溝通彼此,而且我用我的代碼是這樣的:\t \t而((N =讀(襪子,rcv_buffer,LEN))!= 0),以保證收到的整個消息,那麼服務器可以回覆,等等.. – sana

+0

您可能具有發送端在一個單一的'send'或'write'系統調用發出一大堆的字節和recieving最終需要幾個'read'或'recv'爲拿到它,爲實現它。換句話說,TCP/IP傳輸可能被分割(網絡)。 –

回答

2

恐怕你不能那樣做。

如果你想read返回零,你需要關閉套接字。如果您不想關閉套接字,則需要將「通信結束」或「消息結束」作爲協議的一部分。

這樣做的一種常見方式是將每條消息的長度加上前綴。這樣接收方就會知道它何時讀完一條完整的消息,並隨時做任何事情。

+0

我想從使用我的協議失控。,這是因爲我試圖找到其他的方式。 – sana

+0

你可以逃避你喜歡的任何東西,但是這不會改變套接字上的'read'工作方式。回零意味着插座的「側面」已關閉。 – Mat

+0

如果你請在下面的回答中看到我的問題插圖在下面的評論。謝謝你。 – sana

1

如果您希望對等方的read()或recv()返回零,您必須關閉套接字或關閉套接字以輸出。無論哪種情況,您都不能在之後發送任何其他內容。如果這種限制不適合你,你將不得不修改你的要求,因爲它沒有意義。

+0

謝謝你的答案,但在我的情況下,我不得不保持雙方的閱讀和寫作可用,我也必須保證所有發送的信息從一個都已經reviveved通過將讀語句放在while循環中,直到n達到零,如下:\t \t while((n = read(sock,rcv_buffer,len))!= 0)我認爲這可能會引發我的問題。你有沒有解決辦法? – sana

+0

請注意,如果在物理層的消息中出現碎片,我必須在一段時間內讀取。 – sana

+0

@Mat請參閱上面的兩條評論..謝謝你.. – sana

1

「文件結束條件」和「連接關閉」狀態都會告訴接收方在此套接字上不能接收更多數據。你不能通過發送一些魔法數據來模擬。

除了要求close插槽上就可以使用在插座上shutdown(2)只接近或者讀出側或寫入一側的。這可能有助於在有限的情況下,但不是在一般情況下。

1

也許你需要一些多路複用系統調用,如poll(2)

你肯定需要閱讀一些好的材料,如Advanced Linux ProgrammingAdvanced Unix Programming

如果您需要的TCP/IP傳輸到公共交通應用的消息,你需要關心的包裝,並明確分段自己(無論是通過具有固定大小的郵件,或有一些辦法可以知道在傳輸過程中的邏輯消息大小) 。請注意,TCP/IP傳輸可能會被網絡碎片化。