2009-03-09 6 views
2

Ich schreibe ein Perl-Programm, das Nachrichten von zwei Sockets und acta als Schalter sendet und empfängt. Ich muss die empfangenen Nachrichten ändern, die von einem Socket empfangen werden, 3 Bytes den Daten vorangestellt werden und die geänderten Nachrichten schließlich an einen anderen Socket senden. Ich überlasse den Mechanismus select() ... sysread() ... syswrite(), um nach Nachrichten zwischen Sockets zu fragen. Die empfangenen Nachrichten werden während der Änderung in $ buffer gespeichert.Wie kann ich empfangene Socket-Nachrichten in Perl ändern?

Jetzt kann ich folgende Art und Weise verwenden, um die empfangenen Nachrichten zu erhalten:

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

dann kann ich 3 Bytes einfügen @msg. Allerdings weiß ich nicht, wie man die Nachricht in @msg in einen Skalar (wie $ buffer) packt und es mit syswrite() an einen anderen Socket sendet. Kann mir jemand helfen? Vielen Dank im Voraus!

BTW, sind Nachrichten in $ Puffer binär?

+0

Außerdem habe ich versucht my $ shexmsg = join ("", @ msg); $ buffer = pack ("X", $ shexmsg); wo "X" bezeichnet Vorlage des Pack, wie "n *", "b *", "u *". Wie auch immer, alles gescheitert ... Ich weiß nicht, was ich tun soll ... – boyang

Antwort

3

Ja, Nachrichten in $ buffer sind binär (wenn ich rate, was Sie damit richtig meinen). Wenn der einzige Grund für das Entpacken in @msg darin besteht, die Bytes einzufügen, nicht. Verwenden Sie stattdessen substr und schreiben Sie einfach den geänderten $ -Puffer aus. Zum Beispiel:

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

Wenn Sie andere Dinge mit @msg tun, könnten Sie auch weiterhin, dass auch die Verwendung als den substr Einsatz zu tun, bevor es heraus zu schreiben, oder Sie könnten substr oder verpacken oder geteilt verwenden oder vec oder eine Regex, um die benötigten Teile zu analysieren. Sie müssen beschreiben, was Sie tun, um spezifischere Hilfe zu erhalten.

+0

Neben dem Einfügen von 3 Bytes in $ Puffer, muss ich auch den Header und den Text der Nachricht identifizieren.Was soll ich tun? Kann substr() noch funktionieren? – boyang

+0

Schließlich verwende ich @msg, um Nachrichten zu analysieren und 3 Bytes in $ Puffer für bestimmte Nachrichten einzufügen.Ich denke mit substr ($ Puffer, , ) kann bestimmte Informationen der Nachricht zur Analyse erhalten (zum Beispiel msg Typ wird durch 1 Byte bezeichnet), aber ich habe es nicht versucht. – boyang

+0

Übrigens, wenn ich auch die ersten zwei Bytes von $ buffer modifizieren möchte, was soll ich tun? Da die ersten zwei Bytes von $ buffer die Länge der Nachricht angeben und nach dem Einfügen von 3 Bytes in die Nachricht, sollte auch die Nachrichtenlänge entsprechend geändert werden. – boyang

1

Wenn Sie unpack verwendet haben, um die Daten von $buffer zu erhalten, haben Sie versucht, pack verwenden, um die Daten zurück dort zu setzen?

+0

Das hat den Vorteil, fast den gleichen Code in beide Richtungen zu verwenden, soweit ich mich erinnere. Ich könnte mich irren, obwohl - pack() und unpack() meine aktuellen Schwachstellen in Perl sind. –

+0

Ich versuchte meine $ shexmsg = join ("", @ msg); $ buffer = pack ("X", $ shexmsg); wo "X" bezeichnet Vorlage des Pack, wie "n *", "b *", "u *". Jedoch alle fehlgeschlagen ... Ich weiß nicht, was zu tun ist ... – boyang

Verwandte Themen