2012-02-22 4 views
0

draft 00과 같이 draft 17과 이전 버전을 모두 지원해야하는 작은 WebSocket 서버 응용 프로그램을 작성했습니다. 나는 최신 초안에 아무런 문제가 없었지만, 초안 00 클라이언트를 행복하게 만들 수는 없습니다. 테스트 목적서버 측 초안 WebSockets 핸드 셰이크 응답

난 (이전) 공식에 제공된 예를 사용 draft 00 docuemnt 페이지 7

Sec-WebSocket-Key1: 18x 6]8vM;54 *(5: { U1]8 z [ 8 
Sec-WebSocket-Key2: 1_ tx7X d < nw 334J702) 7]o}` 0 

Tm[K T2u 

숫자들을 연결 및 스페이스로 나누어 키를 계산

카운트는, I는 두 정수 따라 얻을 및 (이 두 개의 숫자가 문서에도 있음).

  1. 문자열에 연결하여
  2. 빅 엔디안에 개별적으로 결과를 변환하고 지난 8 비트 (Tm[K T2u)를 추가합니다

    다음, 그것은에 말한다.

  3. 내가 다음 코드 제작 한이 지식

무장 단계 1과 2에서 생성 된 문자열에서 128 비트 MD5 합계 만들기 : 여기

#define BYTE 8 
#define WORD 16 

// Little Endian to Big Endian short 
#define LE_TO_BE_SHORT(SHORT)\ 
    (((SHORT >> BYTE) & 0x00FF) | ((SHORT << BYTE) & 0xFF00)) 

// Little Endian to Big Endian long 
#define LE_TO_BE_LONG(LONG)\ 
    (((LE_TO_BE_SHORT(LONG >> WORD)) | \ 
    ((LE_TO_BE_SHORT((LONG & 0xFFFF)) << WORD)))) 

uint num1 = LE_TO_BE_LONG(155712099); 
uint num2 = LE_TO_BE_LONG(173347027); 

QString cookie = QString::fromUtf8("Tm[K T2u"); 
QString c = QString::number(num1) + QString::number(num2) + cookie; 

QByteArray data = c.toUtf8(); 
qDebug() << QCryptographicHash::hash(data, QCryptographicHash::Md5); 

것은 내가 무엇을 얻을 :

←→»α√r¼??┐☺║Pa♠µ 

그리고 여기가

(초안 예에 따라, 다시) 예상 무슨이다

다른 측면에서, 나는 wikipedia article이 엔디안 변환에 대해 언급하지 않는다는 것을 알아 챘습니다. 위의 코드를 변환하지 않고 (위키 피 디아 예제와 초안의 예제 모두) 시도했지만 여전히 예상 결과를 재현 할 수 없습니다.

누구나 여기서 문제를 지적 할 수 있습니까?


는 편집 :

나는 this document이 프로토콜의 더 나은 설명이 발견했다. 그것은 다른 드래프트 (76)이지만 핸드 셰이크 측면에서 00과 유사합니다.

답변

2

마지막으로 제 동료의 신선한 눈을 빌려 내가 잘못하고있는 것을 알아 냈습니다. 기본적으로 나는 두 개의 정수를 문자열로 연결했다.

uint num1 = LE_TO_BE_LONG(155712099); // macros definition can 
uint num2 = LE_TO_BE_LONG(173347027); // be found in the question 
QString cookie = QString::fromUtf8("Tm[K T2u"); 

QByteArray array; 

array = QByteArray((const char*)&num1, sizeof(int)); 
array += QByteArray((const char*)&num2, sizeof(int)); 
array += QByteArray(cookie.toStdString().data(), cookie.length()); 

qDebug() << QCryptographicHash::hash(array, QCryptographicHash::Md5); 

확실 확인 당신이 Qt를이 약간 더 큰 배열이 쓰레기로 채워진 상자 때문에 크기를 고려하지 않습니다 오버로드 된 생성자를 사용하지 않는 대신 내가 바이트를 연결할 필요가 있었다. 적어도 그건 내 경우 였어.

2

Herewebsockify의 C 구현에서의 계산입니다. 그 작품을 알고 있으므로 참조로 사용할 수 있습니다.

+0

+1 고마워, 나는 네가 대답하고있는 것처럼 내 솔루션도 추가하고 있었다 :) – unexplored