开发者社区> 问答> 正文

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

代码如下,这段代码在我的vm虚拟机里可以正常运行,服务端能收到握手消息。但把代码放到阿里云服务器上时就,能收到accept请求,就是没触发read事件。有没谁遇到过相同的问题,求解啊! 是不是阿里云服务器的环境哪有问题,还是有哪个库有问题。

服务端代码:

    for (n = 0; n < nfds; ++n)
    {
        if (events[n].data.fd == listenfd) 
        {
            connfd = accept(listenfd, (struct sockaddr *)&cliaddr,&socklen);
            if (connfd < 0) 
            {
                perror("accept error");
                continue;
            }

            sprintf(buf, "accept form %s:%d\n", inet_ntoa(cliaddr.sin_addr), cliaddr.sin_port);
            printf("%d:%s", ++acceptCount, buf);

            if (curfds >= MAXEPOLLSIZE) {
                fprintf(stderr, "too many connection, more than %d\n", MAXEPOLLSIZE);
                close(connfd);
                continue;
            } 
            if (setnonblocking(connfd) < 0) {
                perror("setnonblocking error");
            }
            ev.events = EPOLLIN | EPOLLET;
            ev.data.fd = connfd;
            if (epoll_ctl(kdpfd, EPOLL_CTL_ADD, connfd, &ev) < 0)
            {
                fprintf(stderr, "add socket '%d' to epoll failed: %s\n", connfd, strerror(errno));
                return -1;
            }
            curfds++;
            continue;
        } 
        // 处理客户端请求
        if (handle(events[n].data.fd) < 0) {
            epoll_ctl(kdpfd, EPOLL_CTL_DEL, events[n].data.fd,&ev);
            curfds--;


        }
    }
}
int handle(int connfd) {
    int nread;
    char buf[MAXLINE];
    nread = read(connfd, buf, MAXLINE);//读取客户端socket流

    if (nread == 0) {
        printf("client close the connection\n");
        close(connfd);
        return -1;
    } 
    if (nread < 0) {
        perror("read error");
        close(connfd);
        return -1;
    }    
    buf[nread] = '\0';
    printf("received:%s\n",buf);
    write(connfd, buf, nread);//响应客户端  
    return 0;
}

客户端就是new WebSocket(url)

遇到了同样的问题,在CSDN看到了,希望阿里云团队能够给出正确、标准的答案~请查看

展开
收起
刘刚_ 2020-05-23 14:36:43 1356 0
1 条回答
写回答
取消 提交回答
  • 、在阿里云服务器实例创建安全组规则,添加规则。不懂添加规则可以看阿里云教程

    2、开启防火墙

    systemctl start firewalld 3、设置打开的端口号(永久打开) firewall-cmd --add-port=8000/tcp --permanent 4、更新一下:在设置好端口后,需要执行 firewall-cmd --reload 5、查看已经打开的端口 firewall-cmd --list-all 6、阿里云端服务器socket绑定阿里云的私网地址 7、要连接阿里云服务器的客户端的socket要设置为阿里云的公网地址

    注意:6、7这两点,本人被坑了,百度查到解决方案,最后熬夜试出来了,哭笑~~,阿里云服务器有两个IP地址,一个是公网地址(就是短信通知给你的就是公网地址),一个是私有地址(直接用 ifconfig 查看到的私有地址)

    2021-02-08 00:03:19
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
如何运维千台以上游戏云服务器 立即下载
网站/服务器取证 实践与挑战 立即下载
ECS快储存加密技术 立即下载