2011-12-18 2 views
1

최신 websocket 사양을 구현하려고합니다. 그러나, 나는 성공적인 악수 게시물 unmasking 단계를 통해 얻을 수 없습니다.websocket 클라이언트 패킷 unframe/unmask

나는 다음과 같은 수신 웹 소켓 프레임 : 여기에 정의 된 기본 프레임 프로토콜 당으로

<<129,254,1,120,37,93,40,60,25,63,71,88,92,125,80,81,73, 
51,91,1,2,53,92,72,85,103,7,19,79,60,74,94,64,47,6,83, 
87,58,7,76,87,50,92,83,70,50,68,19,77,41,92,76,71,52, 
70,88,2,125,90,85,65,96,15,14,20,107,31,14,28,100,27,9, 
17,122,8,72,74,96,15,86,68,37,68,18,76,48,15,28,93,48, 
68,6,73,60,70,91,24,122,77,82,2,125,80,81,85,45,18,74, 
64,47,91,85,74,51,21,27,20,115,24,27,5,37,69,80,75,46, 
18,68,72,45,88,1,2,40,90,82,31,37,69,76,85,103,80,94, 
74,46,64,27,5,60,75,87,24,122,25,27,5,47,71,73,81,56, 
21,27,93,48,88,76,31,57,77,74,11,55,73,68,73,115,65,81, 
31,104,26,14,23,122,8,75,68,52,92,1,2,110,24,27,5,53, 
71,80,65,96,15,13,2,125,75,83,75,41,77,82,81,96,15,72, 
64,37,92,19,93,48,68,7,5,62,64,93,87,46,77,72,24,40,92, 
90,8,101,15,28,83,56,90,1,2,108,6,13,21,122,8,82,64,42, 
67,89,92,96,15,93,19,56,28,8,65,101,31,94,16,105,28,10, 
20,56,30,14,65,56,27,93,71,106,16,11,17,63,25,4,17,57, 
73,89,17,59,29,88,29,106,24,27,5,46,65,72,64,54,77,69, 
24,122,66,93,93,49,5,12,8,109,15,28,76,59,90,93,72,56, 
76,1,2,41,90,73,64,122,8,89,85,50,75,84,24,122,25,15, 
23,105,25,5,19,106,26,14,20,111,25,27,5,53,77,85,66,53, 
92,1,2,110,26,13,2,125,95,85,65,41,64,1,2,108,27,10,19, 
122,7,2>> 

(http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-17#section- 5.2) 내가 가지고

fin:1, rsv:0, opcode:1, mask:1, length:126 

마스크 + 응용 페이로드 데이터가 나옵니다 :

<<87,58,7,76,87,50,92,83,70,50,68,19,77,41,92,76,71,52,70,88,2,125,90,85,65,96, 
15,14,20,107,31,14,28,100,27,9,17,122,8,72,74,96,15,86,68,37,68,18,76,48,15, 
28,93,48,68,6,73,60,70,91,24,122,77,82,2,125,80,81,85,45,18,74,64,47,91,85, 
74,51,21,27,20,115,24,27,5,37,69,80,75,46,18,68,72,45,88,1,2,40,90,82,31,37, 
69,76,85,103,80,94,74,46,64,27,5,60,75,87,24,122,25,27,5,47,71,73,81,56,21, 
27,93,48,88,76,31,57,77,74,11,55,73,68,73,115,65,81,31,104,26,14,23,122,8,75, 
68,52,92,1,2,110,24,27,5,53,71,80,65,96,15,13,2,125,75,83,75,41,77,82,81,96, 
15,72,64,37,92,19,93,48,68,7,5,62,64,93,87,46,77,72,24,40,92,90,8,101,15,28, 
83,56,90,1,2,108,6,13,21,122,8,82,64,42,67,89,92,96,15,93,19,56,28,8,65,101, 
31,94,16,105,28,10,20,56,30,14,65,56,27,93,71,106,16,11,17,63,25,4,17,57,73, 
89,17,59,29,88,29,106,24,27,5,46,65,72,64,54,77,69,24,122,66,93,93,49,5,12,8, 
109,15,28,76,59,90,93,72,56,76,1,2,41,90,73,64,122,8,89,85,50,75,84,24,122, 
25,15,23,105,25,5,19,106,26,14,20,111,25,27,5,53,77,85,66,53,92,1,2,110,26, 
13,2,125,95,85,65,41,64,1,2,108,27,10,19,122,7,2>> 

32 비트 마스크 반면 키를 보내고 것은 :

j     = i MOD 4 
transformed-octet-i = original-octet-i XOR masking-key-octet-j 

그러나, 나는 기본적으로 XML 패킷 인 클라이언트 측에서 보낸 내 원래의 진수를 얻을하지 않는 것 :

<<37,93,40,60,25,63,71,88,92,125,80,81,73,51,91,1,2,53,92,72,85,103,7,19,79,60, 
74,94,64,47,6,83>> 

http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-17#section-5.2 당으로. 모든 방향, 수정, 제안을 크게 주시면 감사하겠습니다.

+0

실제로, 그러나 기본 프레이밍 프로토콜에 대한 변경 사항은 없습니다. 위의 링크에서 정의 된 것과 동일합니다. –

+0

github에서 잘못된 프로젝트를 확인하십시오. 그것은 필요한 모든 웹 소켓 파싱 코드를 가지고 있습니다. 원래 코드는 프로세스 기반 접근법을 사용하며 코드를 재사용하기는 다소 어렵습니다 (https://github.com/ostinelli/misultin/blob/master/src/misultin_websocket.erl). 프로세스 기반 대신 기능적 foldl 유사 구문 분석 코드가 필요한 경우 misultin (https://github.com/gleber/misultin/branches/functionalize-ws-code)을 살펴보십시오. – gleber

답변

1

당신은 프로토콜 사양의 데이터 프레이밍 섹션을 잘못 읽은 것 같습니다.

첫 번째 바이트 (129)에 대한 해석은 정확합니다. - fin + opcode 1 - 문자 메시지의 마지막 부분 (첫 번째 부분).
다음 바이트 (254)는 메시지 본문이 마스크되고 다음 2 바이트가 길이를 제공함을 의미합니다 (길이가 126 또는 127 인 것은 길이가 7 비트로 표현 될 수없는 더 긴 메시지를 의미 함). 다음 2 바이트는 길이를 유지하고, 127은 다음 4 바이트를 의미 함).
다음 2 바이트 -1, 120 -은 메시지 길이가 376 바이트임을 나타냅니다.
다음 4 바이트 - 37,93,40,60 -이 (가) 귀하의 마스크입니다. = 'jaxl에 제거 =의'2167299354 ':'//jabber.org/protocol/httpbind HTTP '
나머지 데이터는 당신이 쓰는대로 메시지를

& ltbody의의 xmlns =을주는 변화해야한다 메시지입니다. 'xmpp : xmpp : xbosh'ack = '1'route = 'xmpp : dev.jaxl.im : 5222'wait = '30 ' hold = '1'content = 'text/xml; charset = utf-8 'ver ='1.1 'newkey ='a6e44d87b54461e62de3ab7874b184dae4f5d870 'sitekey ='jaxl-0-0 'iframe ='true 'epoch ='1324196722121 'height ='321 'width ='1366 '/>

+0

아직 시도하지 못했지만 이것이 잡을 것이라고 믿습니다. 아마 나는 그것을 올바르게 이해했지만 올바르게 (주로 erlang 코드 내에서 비트/바이너리의 부적절한 처리 때문에) 그것을 구현하지 않았다. 오른쪽 포인터 주셔서 고마워, 그리고 네, 참으로 이것은 내가 unmasking 후 찾고있는 패킷입니다 :) 여기에서 나머지를 분필 것입니다, 감사합니다 Logged –

관련 문제