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=""