2010-03-31 107 views
1

由於我無法創建新標籤,因此此帖被錯誤標記爲'發送'。python socket.recv/sendall呼叫阻止

我對這個簡單的回聲服務器有一個非常基本的問題。以下是一些代碼片段。

客戶

while True: 
data = raw_input("Enter data: ") 
mySock.sendall(data) 
echoedData = mySock.recv(1024) 
if not echoedData: break 
print echoedData 

服務器

while True: 
print "Waiting for connection" 
(clientSock, address) = serverSock.accept() 
print "Entering read loop" 
while True: 
    print "Waiting for data" 
    data = clientSock.recv(1024) 
    if not data: break 
    clientSock.send(data) 
clientSock.close() 

現在這個工作好了,當客戶端發送一個空字符串(通過敲擊回車鍵響應「輸入數據」),除了在這種情況下,我看到了一些死鎖行爲。

現在,當用戶按下客戶端返回時發生了什麼?我只能想象sendall調用塊將等待一些數據添加到發送緩衝區,導致recv調用依次被阻止。這裏發生了什麼?

感謝您的閱讀!

回答

3

更多類似的sendall()調用什麼也不做(因爲沒有要發送的數據),從而recv()呼叫客戶端上塊等待數據,但因爲沒有被髮送到服務器,服務器永遠不會發送任何數據回來,因爲它的初始recv()也被阻止,因此兩個進程都被阻止。

+0

感謝您的幫助! – fsm 2010-03-31 02:17:39