python socket.recv / sendall блокировка вызовов - PullRequest
1 голос
/ 31 марта 2010

Это сообщение неправильно помечено как "отправить", так как я не могу создавать новые теги.

У меня очень простой вопрос об этом простом эхо-сервере. Вот некоторые фрагменты кода.

клиент

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 блокируется по очереди. Что тут происходит?

Спасибо за чтение!

1 Ответ

3 голосов
/ 31 марта 2010

Более того, вызов sendall() ничего не делает (так как нет данных для отправки), и, таким образом, вызов recv() на клиенте блокирует ожидание данных, но так как ничего не было отправлено на сервер, сервер никогда не отправляет данные обратно, так как он также заблокирован на своем начальном recv(), и, таким образом, оба процесса заблокированы.

...