2012-03-08 43 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