【问题标题】:python socket.recv/sendall call blockingpython socket.recv/sendall 调用阻塞
【发布时间】:2010-03-31 01:09:43
【问题描述】:

由于我无法创建新标签,因此该帖子被错误地标记为“发送”。

我对这个简单的回显服务器有一个非常基本的问题。这里有一些代码sn-ps。

客户

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()

现在这可以正常工作了,除非客户端发送一个空字符串(通过点击返回键以响应“输入数据:”),在这种情况下我看到一些死锁行为。

现在,当用户在客户端按下 return 时究竟会发生什么?我只能想象 sendall 调用阻塞等待将一些数据添加到发送缓冲区,导致 recv 调用依次阻塞。这里发生了什么?

感谢阅读!

【问题讨论】:

    标签: python sockets send recv


    【解决方案1】:

    更像是,sendall() 调用什么都不做(因为没有数据要发送),因此 client 上的 recv() 调用会阻塞等待数据,但由于没有发送任何数据到服务器,服务器永远不会发回任何数据,因为它在其初始 recv() 上也被阻止,因此两个进程都被阻止。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-16
      • 1970-01-01
      • 2015-08-26
      • 2011-10-16
      • 2014-03-23
      • 1970-01-01
      • 2018-07-24
      相关资源
      最近更新 更多