我想創建一個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
這不是C,這是C++。 – 2012-03-08 20:23:46
這可能有點令人困惑。我試圖做的是,我實現了該代碼,並沒有奏效。連接每次都被丟棄。因此,爲了找到錯誤,我在RFC中採用了示例數據,並試圖查看我的編碼值是否正確。但事實並非如此。但是我的程序創建的base64編碼值與在線base64編碼器的編碼完全相似。所以我相信我的是正確的,RFC是錯誤的。但如果我的是正確的,那麼爲什麼它不工作 – 2012-03-08 20:27:47
嗯。實際上我所有的代碼都是C語言,但散列和編碼部分都是C++。而且我沒有寫這些代碼。 – 2012-03-08 20:28:59