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
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 乘性高斯噪声在深度学习网络中的应用
  • ¥15 运筹学排序问题中的在线排序
  • ¥15 关于docker部署flink集成hadoop的yarn,请教个问题 flink启动yarn-session.sh连不上hadoop,这个整了好几天一直不行,求帮忙看一下怎么解决
  • ¥30 求一段fortran代码用IVF编译运行的结果
  • ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集
  • ¥15 C++ 头文件/宏冲突问题解决
  • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
  • ¥50 安卓adb backup备份子用户应用数据失败
  • ¥20 有人能用聚类分析帮我分析一下文本内容嘛
  • ¥30 python代码,帮调试,帮帮忙吧