[英]Websocket server in C++ programming error
我正在尝试创建一个websocket服务器程序。 这是握手代码。 但是,当我尝试使用chrome连接时,连接将被删除。 看看这个,看看你是否能找到任何错误。
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;
}
用于测试目的:
key =“dGhlIHNhbXBsZSBub25jZQ ==”
唯一键=“258EAFA5-E914-47DA-95CA-C5AB0DC85B11”
sha1 hash:“b37a4f2cc0624f1690f64606cf385945b2bec4ea”
这是由我的sha1散列函数产生的。
根据RFC6455的实际sha1哈希:“0xb3 0x7a 0x4f 0x2c 0xc0 0x62 0x4f 0x16 0x90 0xf6 0x46 0x06 0xcf 0x38 0x59 0x45 0xb2 0xbe 0xc4 0xea”
base64 encoded =“YjM3YTRmMmNjMDYyNGYxNjkwZjY0NjA2Y2YzODU5NDViMmJlYzRlYQ ==”
这是由我的base64编码器产生的
根据RFC6455的实际base64编码:“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
您必须编码散列的字节值。 现在你在编码之前将哈希值转换为十六进制字符串。
解码“s3pPLMBiTxaQ9kYGzzhZRbK + xOo =”并将输出转换为十六进制字符串,你会看到它是B3 7A 4F 2C C0 62 4F 16 90 F6 46 06 CF 38 59 45 B2 BE C4 EA
另一方面, “YjM3YTRmMmNjMDYyNGYxNjkwZjY0NjA2Y2YzODU5NDViMmJlYzRlYQ ==” ,当解码时产生(字符串) “b37a4f2cc0624f1690f64606cf385945b2bec4ea” 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.