2012-01-29 7 views
4

저는 멀티 스레드 분산 네트워킹 알고리즘을 작성하고 있습니다._socketobjects를 매개 변수로 전달

새 연결을 수신하는 스레드가 하나 있습니다. 새로운 연결이 설정 될 때마다 별도의 스레드가 해당 연결의 메시지를 수신하기 위해 시작됩니다.

내 문제는 내가 열어 놓은 소켓이 연결 수신기 내부에서 양방향으로 완벽하게 작동한다는 것입니다. 해당 연결에 대한 소켓 객체를 메시지 수신기에 전달한 후 소켓에서 데이터를 읽을 수는 있지만 데이터를 보내면 원격 호스트에 도달하지 않습니다.

def connection_listener(port, start_e, terminate_e): 

    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
    s.settimeout(1) 
    s.bind(('', port)) 

    s.listen(1) 

    while (not start_e.isSet()): 
     try: 
      conn, addr = s.accept() 

      msg_in = conn.recv(1024).split(":") 
      if (msg_in[1]=="hello"): 
       # If addr sends us a 'id:hello', we reply with a 'my_id:welcome' 
       conn.send(str(my_id)+":welcome") 

       t = Thread(target=message_listener, args=(conn, addr[0], terminate_e,)) 
       t.start() 
     except: 
      pass # timeout 


def message_listener(conn, address, terminate_e): 

    while (not terminate_e.isSet()): 
     try: 
      msg_in = conn.recv(1024) 

      # Here I can receive everything that I send from the other end of conn, 
      # but conn.send("any data") doesn't reach the remote host 

내가 뭘하려는 것은 CONN를 사용하여 메시지 수신기 스레드의 승인과 같은 메시지를 보낼 수 있습니다 :

여기 내 코드에서 필수 싹둑입니다. 어떻게 든 가능합니까 아니면 내가 생각하고 잘못하고 있습니까?

답변

1

나는 이것을 스스로 분류 했으므로 답을 나누겠다.

원하는 길이까지 0으로 패딩하여 프로토콜 교환 고정 크기 메시지를 만들었습니다. 필자는 하드웨어의 관점에서 볼 때 매우 작은 32 바이트의 길이를 사용했습니다. 그럼에도 불구하고 그것은 예상대로 작동하는 것 같습니다.

는 실용적으로 내 솔루션은 다음과 같습니다

def send_everyone(message): 
    for i in range(len(peers)): 
     chunk = (str(my_id)+":"+message).rjust(32, '0') 
     peers[i].send(chunk) 

그리고 수신 측에 우리가 원하는 한 번에 32 바이트 :

def message_listener(conn, address, terminate_e): 
    while (not terminate_e.isSet()): 
     try: 
      msg_in = conn.recv(32) 

      ...