2012-01-18 13 views
1

私がこのコードで見ている問題は、動作しているにもかかわらず、このサーバに送信する情報クライアント(プレイヤ)の中には、両方ともrecvfrom()を持っているので、 'clientRequests'にあります。ですから、WHICH addrを指定することができれば、recvfrom()のパラメータとして情報が必要になります。私はそれがC++で可能だと信じていますが、それはPythonであり、どうですか? TCPではこの問題は存在しませんが、UDPを優先します。Python UDP recvfrom()特定のアドレス

次のようなものです:recvfrom(512、address =(ip、port))?

「アクセス許可」は、新しいクライアント接続を処理するために使用されます。

問題は、クライアントから送信された位置、イベントなどの情報が「許可」で処理されないことにあります。

class Server: 
    def __init__(self): 
     #host = '192.168.0.2' 
     host = '127.0.0.1' 
     port = 50007 
     addr = (host, port) 
     self.UDPSock = socket(AF_INET, SOCK_DGRAM) 
     self.UDPSock.bind(addr) 
     self.UDPSock.settimeout(5.0) 
     self.searchForClients = True 
     self.playersOnline = [] 
     threading.Thread(target=self.permission).start() 
     Gui.add_event("Server online on port %s" % port) 


    def permission(self): 
     global _status 
     while self.searchForClients: 
      time.sleep(0.5) 
      _status.set("Status: Running; Connected: %s" % len(self.playersOnline)) 
      try: 
       clientMessage, addr = self.UDPSock.recvfrom(1024) # , MSG_PEEK 
      except: 
       clientMessage = "" 
      if clientMessage == "CONNECT" and addr not in self.playersOnline:      
       if self.searchForClients: 
        self.addNewClient(addr) 

      elif clientMessage == "DISCONNECT" and addr in self.playersOnline: 
       self.removeClient(addr) 

     Gui.add_event("No longer accepting logins") 
     return False 

    def clientRequests(self, addr): 
     latestRequest = time.time() 
     while addr in self.playersOnline: 
      time.sleep(0.01) 
      try: 
       data, requestAddr = self.UDPSock.recvfrom(1024) 
      except: 
       requestAddr, data = "", "" 
      if requestAddr == addr: 
       latestRequest = time.time() 
       dataCommand = data.split(':') 
      if time.time() - latestRequest > 2: 
       if addr in self.playersOnline: 
        self.removeClient(addr) 

     if not self.searchForClients:  
      Gui.add_event("Player %s(%s) forcibly removed" % addr) 
     return False 

答えて

1

私はスレッドがこのような単純なUDPサーバーを不必要に複雑にすると信じています。パケットの送信元アドレスがすでに見えているかどうかに基づいて、ソケットで待機し、呼び出しを送信するだけです。

いいえ、通常のrecvfrom(2)システムコールでは、データを取得するアドレスを「フィルタする」ことはできません。その情報を取得するためだけです。フィルタリングはUDPソケットのconnect(2)で行われますが、ソケットごとに1つのソースに制限されます。

+0

これは実際に私が友達と一緒にやっているオンラインゲームプロジェクトです。各クライアントに1つのスレッドを持たせることが重要です。その1つのスレッドは、そのアドレスだけを聞くことができます。明らかにサーバークラス全体ではありません編集:私はconnect(2)ありがとうございます.. – KnasScripter

+0

ちょうど提案 - 状態マシンの面でゲームについて考えてみてください。スレッドはfalseです。 –

関連する問題