2010-04-29 126 views
1

我在從套接字讀取數據時遇到問題。假設有一個等待客戶端連接的服務器套接字。當我編寫客戶端到connect()到服務器套接字/端口時,看起來我已連接。但是,當我試圖read()服務器應該寫在套接字上的數據時,read()函數掛起,直到服務器應用程序停止。從套接字讀取數據

如果套接字已連接,爲什麼read()調用會掛起?我相信我沒有真正連接到套接字/端口,但我無法證明它,B/C connect()調用沒有返回錯誤。 read()調用也不會返回錯誤,它根本就不會返回。

+0

也許你不得不將消息發送到服務器之前,將回復您。 – 2010-04-29 19:26:24

回答

3

直到接收到一些I/O(或錯誤)時,讀取才會被阻止。

0

您的服務器可能不會將數據寫入套接字,因此您的閱讀器只會阻止等待數據出現在套接字上。

1

除非您明確將讀者的套接字更改爲非阻塞模式,否則讀取的調用將完全按照您所說的操作,直到有可用的數據爲止:在實際讀取某些數據之前,它將永遠阻塞。

您也可以使用netstat(我與-f inet一起使用它)找出已建立的連接並查看套接字連接的狀態。

2

至於約翰& Whirl提到,問題幾乎可以肯定的是,服務器還沒有發送任何數據爲你的read()調用返回。當您開始使用網絡編程時,另一個容易忽視的地方是,在服務器的write()調用中傳輸的數據並不總是與客戶端的read()調用對稱。當服務器可能write("hello world"),您read()可以很容易地返回"hello world""hello wo""hel",或者甚至只是"h"