2012-06-25 4 views
0

RFC 6455 사양을 지원하는 웹 서버를 찾을 수 없어 PHP로 웹 소켓 서버를 프로그래밍하고 있습니다. 그렇게함으로써 나는 phpwebsocket 코드를 기본으로 사용하여 RFC 6455와 호환되도록 만들었습니다. 적어도 나는 메시지 수신 부분을 위해했다. 내가 서버에 메시지를 다시 보내려고하면 다른 메시지가 나타납니다. 나는 이것이 비트 마스킹에서의 나의 기술 때문에 ... 끔찍한 것이라고 확신한다. 따라서 시행 착오를 거친 후에도 여전히이 문제가 있으며 왜인지 모릅니다.WebSockets RFC 6455 사양 - 데이터 전송 오류

Time      OpCode Mask Length Data 
1>2012-06-25T18:05:58.014Z 1  true 4  Ping 
2>2012-06-25T18:06:02.121Z 1  true 5  hello 
3 2012-06-25T18:06:02.121Z A server must not mask any frames that it sends to the server. 

또는

3 2012-06-25T18:06:02.121Z Unexpected continuation frame. 

내가 명령 줄 인터페이스를 사용하여 내 컴퓨터에 PHP 5.4.4을 사용하고 있습니다. 웹 소켓 서버를 시작하려면 php ws.php 만 있으면됩니다. 그런 다음 wsClient.html을 내 고객으로 사용합니다. Windows 8 Preview에서 최신 버전의 Google 크롬 (21.0.1180.4 dev-m)을 사용하면 다음 메시지가 표시됩니다.

github repo에서 PHP 서버 및 클라이언트를 다운로드하고 거기에서 오래 재생할 수 있습니다. 문제는 WebSockets::send 함수에 있습니다.

private function send($client, $payload) 
{ 
    $frame = pack('C2a*', 0b10000001, 0b01111111 & strlen($payload), $payload); 
    socket_write($client, $frame, strlen($frame)); 
} 

내가 뭘 잘못하고 있니?

답변

0

내 문제는 바이너리 구문을 사용할 때 리틀 엔디안 스타일이 아닌 빅 엔디안 스타일을 사용하고 있다는 것이 었습니다. 나는 0b10000001, 0b11111110을해야했을 때 0b10000001, 0b01111111을하고있었습니다.

0

이 메시지는 브라우저가 텍스트 프레임 (opcode의 경우 1)이 아닌 연속 프레임 (opcode의 경우 0)을 얻음을 의미합니다. 나는 당신의 팩 기능이 의도 한 것처럼 작동하지 않는다고 생각합니다. 내가 아닌 PHP 전문가,하지만 더이 같은 아마 뭔가있어 당신이 의도입니다 :

$plen = strlen($payload); 
$frame = pack('CCa{$plen}', ... 

은 또한 당신의 페이로드 길이 계산이 페이로드는 더 이상 125 바이트보다 때 줄을 나눌 예정이다. 페이로드가 126에서 65535 바이트 인 경우 헤더의 세 번째 및 네 번째 바이트에 길이를 넣어야합니다. 페이로드 길이가 65536 이상인 경우 페이로드 길이를 헤더의 3 ~ 10 번째 바이트에 두어야합니다 (헤더의 길이는 페이로드 길이에 따라 다릅니다).

+0

아니, 그 점에서 내 코드가 작동합니다. 확인하기 위해 스타일을 변경했지만 팩 형식에 대한 짧은 구문은 완벽하게 유효합니다. 또한 125자를 초과하는 메시지를 보낼 수 없다는 것을 알고 있습니다. 처음에는 메시지를 보내려고합니다. –

+0

"예기치 않은 연속 프레임"이 표시됩니다. 와이어상의 비트가 잘못되었음을 의미합니다. 가장 좋은 이론은 pack() 호출이 예상되는 동작을 제공하지 않는다는 것입니다. 아마 당신은 wireshark (또는 tcpdump)를 작동 시켜서 실제로 어떤 것이 있는지 알아봐야합니다. – kanaka

+0

나는 실제로 그 문제가 무엇인지 알아 냈다. 그리고 나는 –