2013-11-06 5 views
3

У меня есть TCP-сервер, для которого мне нужно написать клиент в Python.эквивалент python netcat

Сервер представляет собой ардуино, используя библиотеку arduino_uip; код сервера (почти) совпадает с кодом TCP server example of that library. Он отлично работает с использованием nc в качестве клиента.

Но когда я использую сокеты python (как в this answer) для связи с сервером, сервер зависает при выключении или закрытии сокета.

Возможно, это проблема с сервером; однако, поскольку nc работает нормально как клиент, мой вопрос:

Что делает this answer делать иначе, чем nc, что может объяснить сервер, зависающий при отключении/закрытии соединения)?

Подводя итог работы &, что нет:

  • клиент питона & н.д. -l в качестве сервера: работает
  • пс как клиент & сервер Arduino: работает
  • питон клиент & Arduino сервера: зависание сервер

Код клиентского кода:

import socket 

def netcat(hostname, port, content): 
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    s.connect((hostname, port)) 
    s.sendall(content) 
    s.shutdown(socket.SHUT_WR) 
    while 1: 
     data = s.recv(1024) 
     if data == "": 
      break 
     print "Received:", repr(data) 
    print "Connection closed." 
    s.close() 

Edit:

Оказывается (ответ Превосходство заставил меня думать об этом!), Что это на самом деле проблема времени. Если я добавлю sleep (0.5) перед выключением в приведенном выше коде, все работает красиво (как в netcat, где есть ручная задержка до того, как я нажму Ctrl + C). Я полагаю, что мне нужно будет проверить эту библиотеку arduino сейчас ...

+1

ли вы попробуйте удалить 's.shutdown()' вызов ? Вы говорите, что это зависает на 'socketshutdown или close' - вы имеете в виду оба/или? – Gerrat

ответ

2

Посмотрел источник netcat (svn checkout svn: //svn.code.sf.net/p/netcat/code/trunk netcat- код), и это вызывает только выключение() как раз перед закрытием, а не только после создания сокета

это разница, насколько я могу видеть

+0

Спасибо за этот ответ! Это привело меня к пути к разнице (которая была во времени, глупо мне ...). Я отредактировал вопрос, чтобы это отразить. –