3

Windows マシン上の C で開発されたサーバーと対話する Linux の単純な Asyncore クライアントがあります。

このセットアップは、非同期コア バッファに書き込まれる約 1 秒あたり 1 回のデータ レートに対してはうまく機能しますが、データ レートがそれを超えると (0.1 秒ごとに 1 回テストしました)、Asyncore はすべての書き込みを送信しません。一部のバッファ値は失われ、サーバーに到達しません。

これは、asyncore がループを通過し、ループごとに 1 回送信するデータがバッファーにあるかどうかのみをチェックし、データ レートがループ時間よりも高い場合、データが失われるためだと思われます。これは本当ですか?もしそうなら、これに対する回避策、またはこの問題を引き起こさない Asyncore 以外の別のソケット モジュールはありますか?

私が使用しているコードは次のとおりです。

class DETClient(asyncore.dispatcher):

    buffer = ""
    t = None

    def __init__(self, host, port):

        asyncore.dispatcher.__init__(self)
        self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
        self.connect((host,port))
        self.host=host
        self.port=port
        self.t = ReceiverBoard(self)
        self.t.start()

    def initiate_connection_with_server(self):
        print("trying to initialize connection with server...")
        asyncore.dispatcher.__init__(self)
        self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
        self.connect((self.host,self.port))

    def sendCommand(self, command):
        self.buffer = command +'\0'

    def handle_connect(self):
        pass

    def handle_error(self):
        print("problem reaching server.")
        self.initiate_connection_with_server()

    def handle_close(self):
        self.t.stop()
        self.close()

    def handle_read(self):
        message = str(self.recv(20)) #how many bytes should be read?

        if (message=="b'system_bias_ON'"):
            self.t.enable_sys_bias()

        if (message=="b'system_bias_OFF'"):
            self.t.disable_sys_bias()

        if (message[2:5]=="DET"):
            self.t.DET_bias_command_received = True
            self.t.DET_bias_command_text = message

        if (message[2:7]=="CURVE"):
            self.t.DET_bias_command_received = True
            self.t.DET_bias_command_text = message

    def handle_write(self):
        sent=self.send(self.buffer.encode())
        self.buffer=""
4

1 に答える 1

2

この質問に対する答えを見つけました。この場合、非同期コアのせいではありません。質問で提供されたコードは、バッファ インターフェイスを悪用しています。私がしなければならなかったのは、handle_write メソッドの最後の行を次の行に置き換えることだけでした。

self.buffer = self.buffer[送信済み:]

これで問題は解決します

于 2013-08-18T01:12:09.993 に答える