我在從套接字讀取數據時遇到問題。假設有一個等待客戶端連接的服務器套接字。當我編寫客戶端到connect()
到服務器套接字/端口時,看起來我已連接。但是,當我試圖read()
服務器應該寫在套接字上的數據時,read()
函數掛起,直到服務器應用程序停止。從套接字讀取數據
如果套接字已連接,爲什麼read()調用會掛起?我相信我沒有真正連接到套接字/端口,但我無法證明它,B/C connect()調用沒有返回錯誤。 read()調用也不會返回錯誤,它根本就不會返回。
我在從套接字讀取數據時遇到問題。假設有一個等待客戶端連接的服務器套接字。當我編寫客戶端到connect()
到服務器套接字/端口時,看起來我已連接。但是,當我試圖read()
服務器應該寫在套接字上的數據時,read()
函數掛起,直到服務器應用程序停止。從套接字讀取數據
如果套接字已連接,爲什麼read()調用會掛起?我相信我沒有真正連接到套接字/端口,但我無法證明它,B/C connect()調用沒有返回錯誤。 read()調用也不會返回錯誤,它根本就不會返回。
直到接收到一些I/O(或錯誤)時,讀取才會被阻止。
您的服務器可能不會將數據寫入套接字,因此您的閱讀器只會阻止等待數據出現在套接字上。
除非您明確將讀者的套接字更改爲非阻塞模式,否則讀取的調用將完全按照您所說的操作,直到有可用的數據爲止:在實際讀取某些數據之前,它將永遠阻塞。
您也可以使用netstat
(我與-f inet
一起使用它)找出已建立的連接並查看套接字連接的狀態。
至於約翰& Whirl提到,問題幾乎可以肯定的是,服務器還沒有發送任何數據爲你的read()
調用返回。當您開始使用網絡編程時,另一個容易忽視的地方是,在服務器的write()
調用中傳輸的數據並不總是與客戶端的read()
調用對稱。當服務器可能write("hello world")
,您read()
可以很容易地返回"hello world"
,"hello wo"
,"hel"
,或者甚至只是"h"
也許你不得不將消息發送到服務器之前,將回復您。 – 2010-04-29 19:26:24