2009-03-09 4 views
2

두 개의 소켓과 acta에서 스위치로 메시지를주고받는 Perl 프로그램을 작성 중입니다. 한 소켓에서받은 수신 메시지를 수정하고 데이터에 3 바이트를 추가 한 다음 마지막으로 수정 된 메시지를 다른 소켓으로 보내야합니다. select() ... sysread() ... syswrite() 메커니즘을 사용하여 소켓 간의 메시지를 폴링합니다. 받은 메시지는 수정하는 동안 $ buffer에 저장됩니다.Perl에서받은 소켓 메시지를 어떻게 수정할 수 있습니까?

는 지금은 수신 된 메시지를 얻기 위해 다음과 같은 방법을 사용할 수 있습니다

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

는 내가 @msg하는 3 바이트를 삽입 할 수 있습니다. 그러나 @msg의 메시지를 스칼라 (예 : $ buffer)에 압축하여 syswrite()로 다른 소켓으로 보내는 방법을 모르겠습니다. 아무도 나를 도울 수 있습니까? 미리 감사드립니다.

여기가 $ 버퍼 바이너리의 메시지입니까?

+0

게다가, 나는 시도했다 my $ shexmsg = join ("", @ msg); $ buffer = pack ("X", $ shexmsg); "X"는 "n *", "b *", "u *"와 같은 팩의 템플리트를 나타냅니다. 그러나 모두 실패했습니다 ... 무엇을 해야할지 모르겠군요 ... – boyang

답변

3

예, $ buffer의 메시지는 바이너리입니다. (정확하게 무엇을 의미하는지 추측한다면). @msg에 압축을 푸는 유일한 이유가 없다면 바이트를 삽입하는 것입니다. 대신 substr을 사용하고 변경된 $ 버퍼를 씁니다. 예를 들어 :

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

당신이 @msg 다른 일을하는 경우, 당신은 그것을 밖으로 쓰기 전에 SUBSTR 삽입을하고 뿐만 아니라 것을 계속 사용할 수 있습니다, 또는 당신은 SUBSTR 사용하거나 팩 수 또는 을 분할하거나 vec 또는 필요한 조각을 파싱하는 정규식. 더 구체적인 도움을 받으려면 이 (가) 무엇을하고 있는지 설명해야합니다.

+0

3 바이트를 $ buffer에 삽입하는 것 외에도 메시지의 헤더와 본문을 식별해야합니다. 어떻게해야합니까? substr()이 여전히 작동 할 수 있습니까? – boyang

+0

마지막으로 @msg를 사용하여 메시지를 분석하고 특정 메시지에 대한 $ buffer에 3 바이트를 삽입합니다. substr ($ buffer, , )을 사용하면 분석을위한 메시지의 특정 정보를 얻을 수 있다고 생각합니다 (예 : msg 유형은 1 바이트) 그러나 나는이 방법을 시도하지 않았다. – boyang

+0

덧붙여서, $ buffer의 처음 두 바이트를 수정하고 싶다면 어떻게해야합니까? $ buffer의 처음 두 바이트는 메시지의 길이를 나타내므로 메시지에 3 바이트를 삽입 한 후에 그에 따라 메시지 길이를 변경해야합니다. – boyang

1

unpack을 사용하여 $buffer에서 데이터를 가져온 경우 pack을 사용하여 데이터를 다시 채워 보았습니까?

+0

이것은 내가 기억하는 한 거의 동일한 코드를 두 가지 방법으로 사용하는 이점이 있습니다. 나는 잘못 될 수있다. - pack()과 unpack()은 Perl에서 현재 취약한 부분이다. –

+0

시도했습니다. my $ shexmsg = join ("", @ msg); $ buffer = pack ("X", $ shexmsg); "X"는 "n *", "b *", "u *"와 같은 팩의 템플리트를 나타냅니다. 그러나 모두 실패했습니다 ... 무엇을해야할지 모르겠습니다 ... – boyang

관련 문제