我想创建一个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