C ++構造体に整合pythonUDP伝達構造、

最初のプログラムを与えます:

輸入ランダム
 輸入ソケット
 輸入構造体
 のインポートスレッド
 輸入ピクルス
 輸入JSON
 から構造体のインポート *
 からの時間インポート睡眠


クラスSENDMSG:
     デフ __init__ (自己):
        self.sendType = B \ X01 準備 
        self.cliType = B \ X01 
        自己.lonDir = B ' E ' 
        self.latDir = B "N ' 
        self.cliNum = 1 
        self.lonDeg = 100 
        self.lonMin = 100 
        self.lonSec = 100 
        self.latDeg = 100 
        self.latMin = 100 
        self.latSec = 100 
        self.year = 2019 
        self.month = 9 
        self.day = 6 
        self.hour = 12 
        self.minute = 10 
        self.second = 10 
        self.ipFirst = 192 
        self.ipSecond = 168 
        self.ipThird = 6 
        self.ipFourth= 108 
        self.typeStr = ' cccciiiiiiiiiiiiiiiii ' 

    DEF  __str__ (自己):
         戻りself.cliNumの
 クラスRecMsg():
     DEF  __init__ (自己):
        self.id = B ' \ X02 ' 
        self.ipFirst = 192 
        self.ipSecond = 168 
        セルフ.ipThird = 6 
        self.ipFourth = 108 
        self.port = -1 
        self.errorType = B ' \ X01 ' 
        self.bandWidth = -1
        self.typeStr = ' = ciiiiici ' 


クラス CommunateThread(threading.Thread):  继承父类threading.Thread 
    デフ __init__ (自己、ID、パケット損失、ソケット、localIP、localPortでは、remoteIP、次に、remoteport、ファイル):
        threading.Thread。__init__ (自己)
        self.id = ID 
        self.packetLoss = パケット損失
        self.socket = ソケット
        self.localIP = localIP 
        self.localPort = localPortでは
        self.remoteIP = remoteIP 
        self.remotePort =次に、remoteport 
        self.file = ファイル
     DEF(セルフ)を実行します:   スレッド内で実行されるコードを書くためには、作成後に直接run関数機能を実行して実行されます 
        接続= Falseの
         中に真:
             IF  ません接続します
                self.sendConnect()
            データ、ADDR self.socket.recvfrom =(1024 プリント" 受信送信されたメッセージ{} {} " .format(ADDR、データ))
            recMes = RecMsg()
            recData = struct.unpack(recMes.typeStr、データ)
             を印刷(recData)
            もし recData [0] == B ' \ X01 '  または(recData [0] == B ' \ X03 '   recData [6] == B ' \ X01 ' ):
                self.sendFile(recData)
    DEF readFileの(自己) :
        (self.file、オープンと" RB " Fとして):
            データ = f.read(1024 しながらデータ:
                 収率データ
                データ = f.read(1024 DEF SENDFILE(自己、recData):
        IP = "{} {} {} {}。。。 .format(recData [1]、recData [2]、recData [3]、recData [4 ])
        ポート = recData [5 ]
         試みる
            S = socket.socket(ソケット.AF_INET、socket.SOCK_DGRAM)
            I = 1
             のためのデータself.readFile():
                P = random.randint(1100 もし P < self.packetLoss:
                     続ける
                s.sendto(データ(IPアドレス、ポート))
                スリープ( 0.005 
                、I + = 1
                場合は私%1000 印刷(I、" :{}、1K:{}に送る" .format(IP、ポート))

            プリント" 发送完成、总计发送{} K " .format(I))
         を除いとして例外E:
             プリント(e)の
     デフsendConnect(自己):
        接続 = SENDMSG()
        connect.cliNum = self.id 
        データ = パック(connect.typeStr、
                    connect.sendType、
                    connect.cliType、
                    connect.lonDir、
                    connect.latDir、
                    connect.cliNum、
                    connect.lonDeg、
                    connect.lonMin、
                    connect.lonSec、
                    connect.latDeg、
                    connect.latMin、
                    connect.latSec、
                    connect.year、
                    connect.month、
                    connect.day、
                    connect.hour、
                    接続します。分、
                    connect.second、
                    connect.ipFirst、
                    connect.ipSecond、
                    connect.ipThird、 
                    connect.ipFourth) 
        データ=パック( 'ccccb'、connect.sendType、connect.cliType、connect.lonDir、connect.lonDir、connect.year)
        印刷(データ)
        self.socket.sendto(データ、(self.remoteIP、 self.remotePort))
        プリント" {}に送信する:{} \ T \ N {} "接続、.format(self.remoteIP、self.remotePort。__str__ ()))
 デフprint_time(のthreadName、遅延、カウンタ):
     パス
コードの表示

メッセージを送信するために熱心に、そのコードは少し混沌とした、ノーコメント、ヒッヒッヒはありません。

私たちは、メッセージを送信するためのPythonの使用UDPだけのバイトを送信することができます知っています。どのように、それを開梱し、C ++(C#の)ボディ構造のパッキングと?パックを使用して解凍。

例えば、私たちの構造はそのようになっています

 

 彼らは、charとint型データです。だから我々は(それは構造があることである)バイトストリームにパックされたこの構造を置きます:

 

 私は、直接バイト(文字/文字)* 4 + 4(INT)* 17 = 32ビットの数を送信パッキン。C ++ / C#のレセプションでは、問題ありません。

しかし、レセプションには、問題が整列することができません。だから、アンパック形式の私達の定義は、受信しました:

 

 「=」を追加する理由については、Pythonドキュメント、詳細な説明を見つけることができます。

中国語版:https://docs.python.org/zh-cn/3.6/library/struct.html

英文版:https://docs.python.org/3.6/library/struct.html

おすすめ

転載: www.cnblogs.com/superxuezhazha/p/11497895.html