我想用C实现一个WebSocket服务器,但是始终不能握手成功,在谷歌浏览器用一个静态网页做调试,以下是C处理请求代码的部分
while (true)
{
app_sock = accept(listen_sock, (struct sockaddr *)&clientaddr, &socklen);
if (app_sock < 0) {
printf("LOG_ERR: %s:%d, accept failed", __FILE__, __LINE__);
system("pause");
exit(1);
}
char IPdotdec[20] = { 0 };
inet_ntop(AF_INET, &clientaddr.sin_addr, IPdotdec, sizeof(IPdotdec));//将二进制整数转换为点分十进制
ntohs(clientaddr.sin_port);//将16位网络字节顺序转换为主机字节顺序
//以下用于多路复用
//FD_ZERO(&set);//清空集合
//FD_SET(app_sock, &set);//将套接字加入集合
//select(app_sock+1, &set, NULL, NULL, NULL);
//if (FD_ISSET(app_sock, &set)) {
// memset(recvbuf, 0, RECV_BUF_SIZE);
//receive data
recvlen = recv(app_sock, recvbuf, RECV_BUF_SIZE, 0);
if (recvlen < 0)
{
if (errno == EINTR)
recvlen = 0;
else
exit(1);
}
printf("receive data is \n: %s \n", recvbuf);
char *sendbuf = handshake(recvbuf, clientaddr, app_sock);
int ret = send(app_sock, sendbuf, strlen(sendbuf), 0);
//int ret = send(app_sock, sendbuf, strlen(sendbuf), 0);
if (ret == SOCKET_ERROR) {
printf("send() failed len:%d:\n", strlen(sendbuf));
//printf("send() len:%d:\n", strlen(sendbuf));
}
closesocket(app_sock);
}
我不明白循环的closesocket()有没有影响,在调试的时候,如果注释掉closesocket()则send()无法发送出消息因为,在谷歌浏览器上看到客户端一直在等待直到到超时;如果加上closesocket()客户端能收到正确的头部,客户端请求头部如下
GET / HTTP/1.1
Connection:Upgrade
Host:127.0.0.1:8088
Origin:null
Sec-WebSocket-Extensions:x-webkit-deflate-frame
Sec-WebSocket-Key:puVOuWb7rel6z2AVZBKnfw==
Sec-WebSocket-Version:13
Upgrade:websocket
我返回的头部如下
HTTP/1.1 101 Switching Protocols
Connection:Upgrade
Server:beetle websocket server
Upgrade:WebSocket
Date:Mon, 26 Nov 2012 23:42:44 GMT
Access-Control-Allow-Credentials:true
Access-Control-Allow-Headers:content-type
Sec-WebSocket-Accept:FCKgUr8c7OsDsLFeJTWrJw6WO8Q=
因为是新手,真的困扰很久了,希望各位前辈帮帮我