前提・実現したいこと
前提
外部装置とソケット通信するインタフェースがあります。
応答内容によって応答が送られてくるポート番号が違います。
正常系の場合と異常系の場合で異なるのですが、当然、どちら経由で送られてくるかはわからないので、両方受信できるようにする必要があります。
Pythonでsocketモジュールを使って実装をしようとしています。
二つのポート番号からの受信を受け付けるようにしたいです。
考えているコード
まず、ポート番号が異なるので、ソケットオブジェクトは必ず2つ生成しておく必要があると認識しています。
その上で、
data1 = socket1.recv(1024)
data2 = socket2.recv(1024)
を同時に行うと、必ずタイムアウトエラーになってしまうので、
下記のように、正常系でタイムアウトになったら異常系のポートを見に行こうと考えています。
一応、動作することは確認できました。
Python
1import socket 2 3# 正常系応答が返ってくる用のポート 4socket1 = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 5socket1.settimeout(3) 6socket1.connect((socket.gethostname(), 10000)) 7 8# 異常系応答が返ってくる用のポート 9socket2 = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 10socket2.settimeout(3) 11socket2.connect((socket.gethostname(), 10001)) 12 13try: 14 data = socket1.recv(1024) 15 print('正常系の応答で返ってきた') 16except socket.timeout as toe: 17 try: 18 data = socket2.recv(1024) 19 print('異常系の応答で返ってきた') 20 except socket.timeout as toe: 21 print('正常でも異常でもない。応答なし') 22 23
質問したい点
上記のように、タイムアウトエラーを契機として見る先を切り替えるしかないでしょうか?
ただ、これだとタイムアウト値でかなり性能が左右されるので、最善の策ではない気がしています。
しかし、代わる方法もわかりません。
何か良い方法はありませんでしょうか?
補足情報(FW/ツールのバージョンなど)
Pycharm
Python3.8くらい
フレームワークは未使用
ソケット通信の実装で主に参考にしたサイト:https://dev.classmethod.jp/articles/python3socketserver/
【追記修正】
情報不足で申し訳ありません。
通信の流れとしては、
①クライアント→サーバ(外部装置)にsend(ポートは固定)
②サーバでrecvして内容を解析。
③サーバ→クライアントにsend
(内容によってポートが2分岐するので不定)
④クライアントでrecv
という流れです。
④の実現方法を質問したかったです。
待ち受ける、というのはおそらく正しくない表現で、クライアントでrecvしたい、という意味でした。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/08/17 03:18
2021/08/17 03:22
2021/08/18 15:27