2017-02-12 54 views
4

我在C客戶端和服務器之間實現了一個簡單的連接。 在客戶端,我在一個循環中讀取文件;每次BUFFER_SIZE個字節並將其發送到服務器端(沒有上傳錯誤處理)。是否從套接字讀取等待或獲取EOF?

//client side 
bytesNumInput = read(inputFileFD,bufInput,BUFFER_SIZE) 
bytesSend = write(sockfd,bufInput,bytesNumInput) 

當然,服務器也處於循環狀態。

//server side 
bytesRecv = read(sockfd,bufOutput,bytesNumInput) 

現在,我的問題是:

  1. 我能EOF在連接的中間,如果服務器讀取比客戶端快?
  2. 閱讀函數是否等待獲取所有數據或與從文件讀取相同?
  3. 是否有可能服務器將在1次迭代中處理2次讀取迭代?
+3

[文檔在這裏。](http://pubs.opengroup.org/onlinepubs/9699919799/functions/read.html)它都在那裏。 – alk

+0

「我可以在中間獲得EOF ......」,通過「EOF」,你問「文件結束可能發生在中間......」**或**「」可以'read() '返回EOF'在中間......「? – chux

+0

@chux這個問題的兩種形式都沒有意義,'EOF在中間'已經是一個矛盾的問題,你的評論是沒有意義的 – EJP

回答

2
  1. 不,服務器會等待傳入的數據。套接字提供控制流。
  2. 問題我不清楚,閱讀總是試圖獲取所有請求的數據,但如果沒有那麼多,那麼它將得到可用的數據
  3. 是的,套接字沒有消息的語義,只是一個字節流。
+0

(2)是自相矛盾的。 – EJP

1

我能EOF在連接的中間,如果服務器讀取比客戶端快?

編號EOF表示對等體已斷開連接。如果連接仍然存在,read()將阻塞,直到(a)至少傳輸一個字節,(b)發生EOF,或(c)發生錯誤。

讀取函數是否等待獲取所有數據或者是否與從文件中讀取數據相同?

參見上面的(a)。

是否有可能服務器將處理2讀入1寫入迭代?

是的。 TCP是一種字節流協議,而不是消息傳遞協議。