Azuer_Z 2016-05-14 13:38 采纳率: 0%
浏览 1571

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条回答

  • devmiao 2016-05-14 23:54
    关注
    评论

报告相同问题?

悬赏问题

  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?