2016-11-28 3 views
0

Привет, У меня есть несколько систем, обменивающихся сообщениями через TCP-соединения.TCP Socket не может отправлять данные даже после выполнения sendall()

В процессе коммуникации между ними, я в первый отправке сообщения, как «Начало процесса», для которого в свою очередь он должен ответить, как «Процесс работы»

Однако сообщение «Процесс работы» не принимается в другую систему, тогда как строка sendall («Процесс запущена») выполняется без каких-либо исключений.

Мой пример кода выглядит следующим образом:

TCP инициализации:

def __init__(self): 
    self.tcp = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    self.tcp.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
    self.tcp.setsockopt(socket.SOL_SOCKET, socket.SO_RCVTIMEO, struct.pack('ll',0,1)) 
    self.tcp.bind('',12000) 
    self.tcp.listen(1) 
    self.client, seld.address = self.tcp.accept() 
    (self.Ip,self.port)= self.address 

Главная Funciton:

while True: 
    msg ="" 
    try: 
     msg = self.client.recv(512) 
    except socket.error as e: 
     if e[0] == 11: 
      # exception for RECVTIMEO used in the socket creation. 
      pass 
    if (msg == "Start Process"): 
      send = "Process Started" 
      self.client.sendall(send) 
      print "status sent" 

Хотя Исполнительное этот кусок кода, я могу получить сообщение " Начало процесса ". но «Процесс запущен» не отправляется, хотя при выполнении строки self.client.sendall (send) я захватил пакеты в wirehark, я получил пакет, содержащий «Start Process», но не получил пакет для «Process Started»

Может кто-нибудь помочь мне с этим ???

ответ

0

У вашего кода есть несколько проблем, но тот, с которым вы сейчас сталкиваетесь, заключается в том, что если вы подключаетесь к порту 12000 с помощью telnet и отправляете «Start Process» и нажимаете enter, вы фактически отправляете и принимаете Start Process \ n вместо Запустите процесс, а оператор if не совпадает. Если вы разделите конечную новую строку, вы можете уменьшить это:

try: 
    msg = self.client.recv(512) 
    msg = msg.strip() 

Возможно, ваша программа может нуждаться в некоторой настройке. Когда вы устанавливаете неблокирование сокета, self.tcp.accept() вызывает исключение, когда вы пытаетесь принять соединение, которого еще нет. То же самое происходит с self.client.recv(), после того как вы получили правильное сообщение. Когда вы добавите полосу, предложение if будет соответствовать, и вы получите ответ. Тем не менее, он будет просто отвечать на запросы, так как он снова пытается повторно (512) снова сбой с исключением, тогда вы его поймаете и снова сделаете предложение if. msg все еще «Start Process», поскольку он не изменился (последовательный recv просто не удался, он не вернул «» или None).

Попробуйте переместить предложение if внутри вашей попытки/исключая конструкцию и только сравните msg, если вы действительно получили его.

Эта программа также будет очень расточительной, поскольку она будет работать в занятом цикле большую часть времени, ожидая либо соединений, либо сообщений. Если вам нужно использовать неблокирующие сокеты, вам необходимо обратиться к этому вопросу.

Лучше всего использовать потоки, чтобы иметь блокирующий поток, который прослушивает и принимает новые подключения, и для каждого соединения он будет порождать рабочий поток. Эти потоки могут блокироваться в recv() до тех пор, пока не будет получено сообщение.

Просто мысль.

Hannu

+0

обновленный вышеупомянутый код, я сбрасываю msg в NULL в цикле. Я не включил мою другую программу здесь в вопрос, который отправляет «Start Process» в эту программу позже. Эта программа просто ждет, когда запускается другая программа, с которой она связывается через TCP, и когда получает «Start Process», он должен отправить «Process Started», но это не так. –

+0

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

+0

... и вы получаете распечатку «статус отправленного», подтверждающий, что sendall() был выполнен? – Hannu

Смежные вопросы