2

私は単純なソケット サーバーを作成しており、クライアントの状態 (認証など) を追跡したいと考えています。handle_read() が呼び出されるたびに、その特定のクライアントについて何も知りません。クライアントのIDか何かを知っていれば助かります。これが私がこれまでに持っているものです:

import asyncore
import socket

class EchoHandler(asyncore.dispatcher_with_send):

    def handle_read(self):
        data = self.recv(8192)
        self.send(data)

class EchoServer(asyncore.dispatcher):

    def __init__(self, host, port):
        asyncore.dispatcher.__init__(self)
        self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
        self.set_reuse_addr()
        self.bind((host, port))
        self.listen(5)

    def handle_accept(self):
        pair = self.accept()
        if pair is None:
            pass
        else:
            sock, addr = pair
            print 'Incoming connection from %s' % repr(addr)
            handler = EchoHandler(sock)

server = EchoServer('localhost', 8080)
asyncore.loop()
4

2 に答える 2

5

からの接続を受信した時点で、クライアントの ID はわかっていますrepr(addr)。返されるタプルは、そのクライアントにデータを送り返すときに使用できる IP とそのクライアントの一意の番号です。クライアントのリストを保持したい場合は、着信接続を受信したときにそのクライアントの情報を格納するディクショナリを検討する必要があります。

その情報を handle_read 関数に渡す場合、コードは次のようになります。

class EchoHandler(asyncore.dispatcher_with_send):
    def setAddr(self, addr):
        self.addr = addr

    def handle_read(self):
        data = self.recv(8192)
        print '%s from %s' % (data, self.addr)
        self.send(data)

class EchoServer(asyncore.dispatcher):

    def __init__(self, host, port):
        asyncore.dispatcher.__init__(self)
        self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
        self.set_reuse_addr()
        self.bind((host, port))
        self.listen(5)

    def handle_accept(self):
        pair = self.accept()
        if pair is None:
            pass
        else:
            sock, addr = pair
            print 'Incoming connection from %s' % repr(addr)
            handler = EchoHandler(sock)
            handler.setAddr(addr) #Set the address of the sender in the EchoHandler

クライアントのアドレスを EchoHandler に送信するだけで、それがどこから来ているかがわかります。これが役立つ/うまくいくことを願っています!

于 2012-05-15T16:45:55.530 に答える
1

ソケットから直接取得できる唯一の「id」は、ソケットへの参照と送信者のアドレスです。それ以外はすべて、受信したデータに基づいています。たとえば、クライアントは ID を最初の 16 バイトとして送信し、それ以降はすべてデータになります。これは、要件を満たすプロトコルを効果的に実装することを意味します。

ssl認証などのためのより簡単で優れた解決策は、Python 標準ライブラリなどのライブラリを使用することです。このsslライブラリは、python ソケットで簡単に使用できる形式で暗号化および認証メカニズムを提供します。安全な認証が必要な場合は、既存のソリューションを使用することを強くお勧めします。

于 2012-05-15T16:45:31.267 に答える