2012-03-08 45 views
3

我想創建一個websocket服務器程序。這是握手代碼。但是,當我嘗試使用chrome進行連接時,連接被丟棄。檢查一下,看看你是否能找到任何錯誤。Websocket服務器在C++編程錯誤

iResult = recv(ClientSocket, recvbuf, recvbuflen, 0); 
    if (iResult > 0) 
    { 

     char *s = strstr(recvbuf,"Sec-WebSocket-Key:"); 
     s = s + strlen("Sec-WebSocket-Key:"); 

     char buff[200] = {}; 
     int i = 0; 
     while((int)*s != 13) 
     { 
      if((int)*s != 32) 
      { 
       buff[i] = *s; 
       i++; 
      } 
      s++; 
     } 
     buff[i] = '\0'; 
     strcat(buff,"258EAFA5-E914-47DA-95CA-C5AB0DC85B11"); 
     hashwrapper *myWrapper = new sha1wrapper(); 
     std::string hash(myWrapper->getHashFromString(buff)); 

     std::string encoded = base64_encode(reinterpret_cast<const unsigned char*>(hash.c_str()), hash.length()); 

     char * handshakeFormat = "HTTP/1.1 101 Web Socket Protocol Handshake\r\n" 
    "Upgrade: WebSocket\r\n" 
    "Connection: Upgrade\r\n" 
    "Sec-WebSocket-Accept: %s\r\n\r\n"; 

     memset(recvbuf,0,sizeof(recvbuf)); 
     sprintf(recvbuf,handshakeFormat,encoded.c_str()); 
       iSendResult = send(ClientSocket, recvbuf, iResult, 0); 


     delete myWrapper; 
     myWrapper = NULL; 
    } 

出於測試目的:

鍵= 「dGhlIHNhbXBsZSBub25jZQ ==」

唯一密鑰= 「258EAFA5-E914-47DA-95CA-C5AB0DC85B11」

SHA1哈希: 「b37a4f2cc0624f1690f64606cf385945b2bec4ea」

這是我的sha1哈希函數產生的。

實際SHA1哈希按RFC6455:編碼= 「YjM3YTRmMmNjMDYyNGYxNjkwZjY0NjA2Y2YzODU5NDViMmJlYzRlYQ ==」

「0xb3 0x7a 0x4f 0x2c上將0xC0 0X62 0x4f 0x16的0x90 0xf6 0×46 0×06 0xcf 0x38 0×59 0×45 0xb2 0xbe 0xc4 0xea」

BASE64這是通過我的BASE64編碼器

實際base64編碼製作每RFC6455: 「s3pPLMBiTxaQ9kYGzzhZRbK + XOO =」

Google chrome以以下格式發送握手數據:

GET /?encoding=text HTTP/1.1 
Upgrade: websocket 
Connection: Upgrade 
Host: localhost:2000 
Origin: http://www.websocket.org 
Sec-WebSocket-Key: SEvjVT+KuQHF0TRSdop3GA== 
Sec-WebSocket-Version: 13 
+1

這不是C,這是C++。 – 2012-03-08 20:23:46

+0

這可能有點令人困惑。我試圖做的是,我實現了該代碼,並沒有奏效。連接每次都被丟棄。因此,爲了找到錯誤,我在RFC中採用了示例數據,並試圖查看我的編碼值是否正確。但事實並非如此。但是我的程序創建的base64編碼值與在線base64編碼器的編碼完全相似。所以我相信我的是正確的,RFC是錯誤的。但如果我的是正確的,那麼爲什麼它不工作 – 2012-03-08 20:27:47

+0

嗯。實際上我所有的代碼都是C語言,但散列和編碼部分都是C++。而且我沒有寫這些代碼。 – 2012-03-08 20:28:59

回答

1

您必須對散列的字節值進行編碼。現在,您在編碼之前將散列轉換爲十六進制字符串。

解碼「s3pPLMBiTxaQ9kYGzzhZRbK +白葉枯病=」和輸出轉換爲十六進制字符串,你會看到它的B3 7A 4F 2C C0 62 4F 16 90 F6 46 06 CF 38 59 45 B2 BE C4 EA

「YjM3YTRmMmNjMDYyNGYxNjkwZjY0NjA2Y2YzODU5NDViMmJlYzRlYQ ==」,而另一方面,在解碼的結果時, (字符串)「b37a4f2cc0624f1690f64606cf385945b2bec4ea」

+0

我曾期待過這種錯誤。我正在使用hashlib庫來計算sha1哈希值。並在上面的代碼中,hash.c_str()返回我的散列值爲**「b37a4f2cc0624f1690f64606cf385945b2bec4ea」**我該如何獲得正確的散列值將傳遞到base64_encode? – 2012-03-09 08:29:25

+0

我不知道hashlib。看看是否有一個函數爲您提供原始散列字節。如果沒有選擇另一個庫,實際上有數百個實現* SHA *。 – pezcode 2012-03-09 14:09:57

+0

**嘿,我被禁止在這裏提問,因爲有人投下了上述問題。有人請取悅它,以便我可以問一些其他問題。** 我試過使用加密++。但它給了我很多錯誤,如**無法解析的外部符號「public:virtual bool ...」**以下是代碼段存在的鏈接http://stackoverflow.com/questions/6981616/using -cryptopp到產生隨機哈希值-SHA1 – 2012-03-09 17:06:58