问题描述
- C实现的Server与Websocket握手失败
-
我想用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=
因为是新手,真的困扰很久了,希望各位前辈帮帮我
解决方案
http://bbs.csdn.net/topics/391951261
时间: 2024-08-30 04:25:33