2012-01-16 55 views
0

我正在編寫客戶端和服務器程序,我正在尋找一種方法來確保在從客戶端/服務器打開的套接字中使用read()或write()函數時,讀取所有字節併發送所有字節。C Unix套接字編程,確保讀/寫字節數?

我假設我將不得不使用循環來檢查讀或寫函數返回的字節數。

像這樣的東西可能是:

#define BUFFER 20 
char buffer[BUFFER]; 

while (I haven't read all bytes from the buffer){ 
     int bytesRead = read(theSocket, myWord, BUFFER); 
} 

而且我怎麼會確保所有字節我想用寫傳輸()已經被傳染?

感謝您的幫助!

+0

完全相同的方式.... – 2012-01-16 02:35:19

回答

1

是的,就像那樣。典型的讀取邏輯如下所示:

1)致電read

2)我們是否得到EOF或錯誤?如果是這樣,返回。

3)我們收到了所有的字節嗎?如果是這樣,返回。

4)轉到步驟1.

需要注意的是,當你調用read,你需要一個指針傳遞它的數據後,緩衝區已被讀取,並且你需要嘗試讀取不會溢出緩衝區的適當數量的字節。另外,如何告訴你是否收到所有字節取決於協議。

要寫入:

1)調用write,指針傳遞到所述第一未寫入的字節和未寫的字節數。

2)我們得到零或錯誤?如果是這樣,返回。

3)我們寫了所有的字節嗎?如果是這樣,返回。

4)轉到步驟1.

注意,你必須適當地調整用於阻塞或非阻塞套接字。例如,對於非阻塞套接字,您必須處理EWOULDBLOCK

+0

感謝您的澄清。 我唯一的問題仍然是如何確定使用read()函數(上面的第3步)時要檢查的字節數,如果您不知道應該接收的確切數量。發送方是否應該使用期望的字節數來啓動消息,以便接收方可以使用第一個字節來確定消息其餘部分的長度(以字節爲單位)? Write()顯然很容易測試,因爲發送的消息可以通過寫入過程看到。 – pandaEater 2012-01-16 03:42:27

+1

您應該遵循您正在實施的協議的規範。如果它說發送者應該給消息加上期望字節數,那麼你應該這樣做。如果它說消息以CRLF終止,那麼你應該這樣做。遵循規範。 (如果它是你自己的協議,那麼做出適當的規範是非常值得的,然後遵循它。) – 2012-01-16 03:50:26

+0

再次感謝您的幫助。順便說一句,我使用tcp,我不確定我是否必須檢查,但我找不到任何快速谷歌搜索的答案。我會花更多的時間研究。 – pandaEater 2012-01-16 03:53:03