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= 

因为是新手,真的困扰很久了,希望各位前辈帮帮我

1个回答

Azuer_Z
Azuer_Z 都是我发的
3 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问