1

単純なUDPパケットデコーダーを作成しようとしています。

packet_decoder(Packet)->
<<Opts:8,MobIdLength:8,MobId:64,MobIdType:8,MgeType:8,SeqNum:16,Rest/binary>> = Packet,
io:format("Options:~p~n",Opts),
io:format("MobIdLength:~p~n",MobIdLength),
io:format("MobId:~p~n",MobId),
io:format("MobIdType:~p~n",MobIdType),
io:format("MgeType:~p~n",MgeType),
io:format("SeqNum:~p~n",SeqNum).

パケットは受信ループを通過します。

rcv_loop(Socket) ->
inet:setopts(Socket, [{active, once}, binary]),
io:format("rcvr started:~n"),
receive
    {udp, Socket, Host, Port, Bin} ->
        packet_decoder(Bin),
        rcv_loop(Socket)
end.

私は取得し続けます(次のエラーは9/7/12 9:30 ESTで編集されました):

** exception error: no match of right hand side value 
                    <<131,8,53,134,150,4,149,0,80,15,1,2,1,2,0,16,80,71,115,
                      52,80,71,115,53,24,63,227,197,211,...>>
     in function  udp_server:packet_decoder/1
        called as udp_server:packet_decoder(<<131,8,53,134,150,4,149,0,80,15,
                                              1,2,1,2,0,16,80,71,115,52,80,71,
                                              115,53,24,63,227,197,...>>)
     in call from udp_server:rcv_loop/1 
     in call from udp_server:init/0 

Erlangシェルでバイナリと同じ変数を作成した場合、つまり

Packet = <<131,8,53,134,150,4,149,0,80,15,1,2,1,2,0,16,80,71,115,52,80,71,115,53,24,63,227,197,211,228,89,72,0,0,0,0,0,0,0,16,0,5,5,32,1,4,255,159,15,18,28,0,34,62,2,0,0,0,0,0,0,0,47,67>>.

<<Opts:8,MobIdLength:8,MobId:64,MobIdType:8,MgeType:8,SeqNum:16,Rest/binary>> = Packet.

それはうまく機能します。これを私が欠けている関数に渡すことに微妙な点はありますか?私は(正しい方法を除いて)すべてだと思うものを試しました。タイプとサイズを設定してみました。私も試しました

<<Rest/binary>> = Packet.  

無駄に。どんな助けでも大歓迎です。

4

3 に答える 3

2

コードを実行したときに発生するエラーは、コードと一致しません。発生しているエラー:

** exception error: no match of right hand side value ...

はエラーであり、パターンがRHSの値と一致しないbadmatch明示的な一致に起因します。のコードに=はありません。これは、実行しているループがこのコードではないことを意味します。したがって、いくつかの質問があります。=rcv_loop/1

  • を含むモジュールを再コンパイルしrcv_loop/1たら、ループを再開して新しいコードを実行しましたか?これは自動的には行われません。
  • 自分が思っているコードをロード/実行していますか?この質問はばかげているように聞こえますが、あるバージョンのコードで作業して別のバージョンをロードするのは非常に簡単で、珍しいことではありません。パスを正しく取得する必要があります。

あなたのコードについて言及されている他のことは、このエラーを与えません。の呼び出しio:format/2は間違っていますが、実際にを呼び出すとエラーが発生しますio:format/2。変数Socketを使用するのはエラーではなく、そのソケットからのみUDPパケットを受信することを意味します。

于 2012-09-07T08:09:20.627 に答える
0

編集:私の答えの最初の部分は完全に間違っていたので、誤解を招かないように、私はそれを削除しました。

発見されたAlexeyKachayevio:formatのように、2番目のパラメーターとしてリストを取ります。

packet_decoder(Packet)->
<<Opts:8,MobIdLength:8,MobId:64,MobIdType:8,MgeType:8,SeqNum:16,Rest/binary>> = Packet,
io:format("Options:~p~n",[Opts]),
io:format("MobIdLength:~p~n",[MobIdLength]),
io:format("MobId:~p~n",[MobId]),
io:format("MobIdType:~p~n",[MobIdType]),
io:format("MgeType:~p~n",[MgeType]),
io:format("SeqNum:~p~n",[SeqNum]).
于 2012-09-07T06:48:23.253 に答える
0

私はそれを理解しました(ちょっと)。私は、他のすべての部分でうまく機能していたEclipseのerlideでこれに取り組んでいました。erlシェルからコンパイルしてみましたが、うまくいきました。eclipseがソースを表す方法、またはerlangコンパイラとシェルを呼び出す方法に若干の違いがあるはずです。erlide.orgで取り上げます。助けてくれてありがとう!

于 2012-09-11T12:08:12.157 に答える