2017-02-08 13 views
0

Я хотел бы сделать UDP-сервер, который отправляет сообщение клиенту UDP вскоре после того, как сервер получит сообщение от клиента. Я использую Python и Google Protobuffer как протокол сообщений.Как отправить UDP-сообщение с UDP-сервера без отправки самому себе?

В настоящее время часть приема сообщений кажется работающей, но в отношении части отправки сообщения возникает проблема: ответное сообщение с сервера не поступает клиенту, а еще хуже, сервер показывает это сообщение (возможно, он отправляет для себя? Сейчас консоль показывает как сообщение от клиента, так и сообщение, которое должно быть отправлено клиенту). Эта проблема не возникла, когда я попробовал аналогичный код на C++ или C#.

Ниже приведены некоторые выдержки из моего кода:

def connect(self): 
    remote = ('x.x.x.x',xxxx) #ip and port 
    self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
    self.sock.settimeout(2.5) 
    self.sock.bind(remote) 
    self.sock.settimeout(None) 

def start(self): 
    while not self.exit_thread: 

     # Get the message from client 
     data, address = self.sock.recvfrom(8192) 

     if data is not None: 

      # De-serialize inbound message from client 
      msg_client = xxx_pb2.msgClient() 
      msg_client.ParseFromString(data) 

      # Display message from client 
      self.display_inbound_message(msg_client) 

      # Create a new message from server 
      msg_serer = xxx_pb2.msgServer() 
      self.create_outbound_message(msg_serer) 

      # Send the Udp message to the client, return the number of bytes sent 
      bytes_sent = self.sock.sendto(msg_server.SerializeToString(), self.remote) 
      if (bytes_sent < 0): 
       print("Error send message") 

У меня нет достаточного опыта для программирования UDP на Python. Пожалуйста, дайте мне знать, если вы заметили что-нибудь.

+0

Как вы называете это? в «потоке» или нет? – Arman

+0

Я пока не использую 'thread', но планирую использовать его после выяснения этой проблемы. Связано ли это с этой проблемой? – kangaroo

ответ

1

Проблема с этим кодом заключается в том, что сервер отвечает самому себе, а не удаленному клиенту. В здесь:

data, address = self.sock.recvfrom(8192) 
# ... 
bytes_sent = self.sock.sendto(msg_server.SerializeToString(), self.remote) 

Оно должно быть:

bytes_sent = self.sock.sendto(msg_server.SerializeToString(), address) 

Это имеет смысл переименовать remote к server_address, потому что адрес этого сервера.