2010-03-31 155 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