C实现的Server与Websocket握手失败

问题描述

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

C实现的Server与Websocket握手失败的相关文章

安装SQL server 提示重新启动计算机失败怎么解决?

  SQL server是微软推出的数据库管理系统广泛使用于大型多处理器的服务器等多种平台.最近有用户在安装SQL server 2008程序是提示重新启动计算机失败问题(如图)相信很多用户都会选择重启电脑但再次安装时也依然出现同样错误问题出现这种现象主要是注册表问题下来看看具体解决方案吧. 安装SQL server显示重新启动计算机失败解决方法/步骤 1.点击"开始"-"运行" 输入regedit 按回车键. 2.找到HKEY_LOCAL_MACHINESOFTW

阿里云服务器收不到websocket握手消息

问题描述 阿里云服务器收不到websocket握手消息 代码如下,这段代码在我的vm虚拟机里可以正常运行,服务端能收到握手消息.但把代码放到阿里云服务器上时就,能收到accept请求,就是没触发read事件.有没谁遇到过相同的问题,求解啊!是不是阿里云服务器的环境哪有问题,还是有哪个库有问题. 服务端代码: for (n = 0; n < nfds; ++n) { if (events[n].data.fd == listenfd) { connfd = accept(listenfd (str

netty4.3ssl通信失败-Netty4.3SSL通信失败,握手失败

问题描述 Netty4.3SSL通信失败,握手失败 使用Netty4.3连接某产品服务端,但ssl通信无法正常建立,请有经验的人联系我,可提供测试代码. QQ:31604274 解决方案 握手失败,一个可能是网络原因连接不通,还可能证书验证等有问题. 解决方案二: javax.net.ssl.TrustManager[] trustAllCerts = new javax.net.ssl.TrustManager[1]; javax.net.ssl.TrustManager tm = new T

ado连接sql数据库-求大神帮忙,ado连接数据库sql server 2005,总是失败

问题描述 求大神帮忙,ado连接数据库sql server 2005,总是失败 #include #include #include #include #import "C:Program FilesCommon FilesSystemadomsado15.dll" no_namespace rename("EOF","ADOEOF") int main() { if(!AfxOleInit()) { AfxMessageBox("ca

php websoket握手失败为什么呢

问题描述 php websoket握手失败为什么呢 我在做php 推送消息到客户端的效果,但是一直报错 这是为什么,哪位大神能告诉一下 解决方案 上周我也做了个类似要求的功能 不过我前端是使用的socke.io后端使用的是 node 博文如下 希望能帮到你博文链接

ssl-关于windows平台下的server端AcquireCredentialsHandle调用失败问题

问题描述 关于windows平台下的server端AcquireCredentialsHandle调用失败问题 securityFuns.AcquireCredentialsHandle执行后,返回1312错误码.如下代码: #include <schannel.h>#define SECURITY_WIN32#include <security.h>#pragma comment(libcrypt32.lib"")int _tmain(int argc _TC

终极解决:iOS 与 Java 服务器之间 SSL 握手失败的解决:Cipher Suites

iOS 与 Java 服务器之间 SSL 握手失败的解决:Cipher Suites 太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. 终极解决: ------------------ iOS 与

Server.CreateObject的调用失败拒绝对此对象的访问的解决方法_应用技巧

今天把一个网站的数据从win2000服务器转移到了win2003服务器上,然后调试,发现在用aspjpeg组件上传图片的时候,提示出错: 其实很多时候是因为你安装的插件权限设置不当造成的.应该坚持你最近安装了什么组件. 最终找到了解决"检查权限时,对Server.CreateObject的调用失败,拒绝对此对象的访问"的方法: windows server 2003默认的安全级别太高了,找到你组件所在的安装目录,右键/属性/安全,添加everyone(我用的是IUSR_WD)的可执行权

sql server native client安装失败,说什么操作系统不支持

问题描述 sql server native client安装失败,说什么操作系统不支持 在线等!!急呀!谢谢啦 解决方案 在下载安装之前,都要看一下安装文件对系统的要求,以及注意一下版本是否匹配.https://msdn.microsoft.com/zh-cn/library/ms131002(v=sql.100).aspx.aspx "") 解决方案二: 用 Windows Installer Clean Up来清理试下 或者超级兔子 优化大师 解决方案三: 你的i系统OS跟安装版