2011-09-08 60 views
2
  1. 如果一個tcp/ip套接字上的read()接收到文件的結尾,那麼eof的存在是否會導致套接字終止?C Sockets termination

  2. 在tcp/ip套接字上執行read()時,如果流的大小未知,讀者是否會收到EOF,以便他可以停止進一步閱讀?

回答

2

否。在TCP協議中沒有EOF這樣的東西。

如果您想在應用程序協議中定義一個協議,您可以這樣做(而且您應該),但是read在它看到它時不會停止或關閉套接字。

TCP純粹是流式基礎。提取「數據包」的數據取決於應用程序。

如果您只需要通過TCP連接發送一條消息,則可以在完成發送後關閉發送方的套接字。然後read接收端將只讀取與發送的數據相同的數據,並且在沒有更多內容被讀取時返回0。但在這種情況下,您必須重新打開一個新連接才能發送下一條消息。

+0

我同意 - 需要TCP套接字的FIN消息才能開始關閉。 –

+0

TCP是一個基於流的協議,Stream按照定義有一個流頭和一個流結束。所以如果發送者發送數據,接收端的流應該有一個流頭和一個流結束。我認爲的流結束是EOF。這是不正確的? – Jimm

+1

@Jimm - 不,這是不正確的。在應用程序級別沒有頭或終點。 TCP正在發送和處理較低級別的數據包。它負責設置流並結束它。在應用程序級別,您基本上只知道從讀取返回零字節時沒有剩餘可讀的內容。 – Duck