2009-03-09 8 views
2

私は2つのソケットとactaからスイッチとしてメッセージを送受信するPerlプログラムを書いています。私は1つのソケットから受信した受信メッセージを修正し、データに3バイトを追加し、最後に変更されたメッセージを別のソケットに送信する必要があります。 select()... sysread()... syswrite()のメカニズムを採用して、ソケット間のメッセージをポーリングします。受信したメッセージは変更中に$ bufferに保存されます。その後、私は@msgに3つのバイトを挿入することができます受信したソケットメッセージをPerlでどのように変更できますか?

my $hexmsg = unpack("H*", $buffer); 
my @msg = ($hexmsg =~ m/../g); 

今、私が受信したメッセージを取得するには、次の方法を使用することができます。しかし、@msgのメッセージをスカラー($ bufferなど)にパックし、syswrite()によって別のソケットに送る方法はわかりません。誰か助けてくれますか?前もって感謝します!

ところで、$ bufferバイナリのメッセージですか?

+0

さらに、私は試しました my $ shexmsg = join( ""、@ msg); $ buffer = pack( "X"、$ shexmsg); ここで、「X」は「n *」、「b *」、「u *」などのパックのテンプレートを示します。しかし、すべて失敗しました...私は何をすべきかわかりません... – boyang

答えて

3

はい、$ bufferのメッセージはバイナリです(私がそのことを正しく意味していると思われる場合)。 @msgに解凍する唯一の理由は、バイトを挿入することだけです。代わりにsubstrを使用し、変更された$バッファを書き出してください。あなたは@msgで他のことをやっている場合、あなたはそれを書き込む前に、SUBSTRインサートをやっていることだけでなく、 を使い続けることができ

substr($buffer, 0, 0, "\x01\x02\x03"); # insert 3 bytes at beginning. 

、またはあなたがSUBSTR使用したり、パックまたは 分割することができたり:たとえばあなたが必要とする部分を解析するvecまたは正規表現。より具体的なヘルプを得るには、 が何をしているのかを説明する必要があります。

+0

3バイトを$ bufferに挿入するだけでなく、メッセージのヘッダーと本文も識別する必要があります。何をすればよいですか? substr()はまだ動作しますか? – boyang

+0

最後に、@msgを使用してメッセージを分析し、特定のメッセージの$ bufferに3バイトを挿入します。たとえば、substr($ buffer、)は、メッセージの特定の情報を解析用に取得できます)しかし、私はこのようにしなかった。 – boyang

+0

ちなみに、$ bufferの最初の2バイトも変更したいのであれば、どうしたらいいですか? $ bufferの最初の2バイトはメッセージの長さを表し、メッセージに3バイトを挿入した後にメッセージの長さもそれに応じて変更する必要があります。 – boyang

1

unpackを使用して$bufferからデータを取得した場合は、packを使用してデータを戻してみましたか?

+0

これは、私が覚えている限り、ほぼ同じコードを両方の方法で使用する利点があります。私は間違っていますが、pack()とunpack()はPerlの現在の弱点です。 –

+0

私は試しました my $ shexmsg = join( ""、@ msg); $ buffer = pack( "X"、$ shexmsg); ここで、「X」は「n *」、「b *」、「u *」などのパックのテンプレートを示します。しかし、すべて失敗しました...私は何をすべきかわかりません... – boyang

関連する問題