代码如下,这段代码在我的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看到了,希望阿里云团队能够给出正确、标准的答案~请查看
、在阿里云服务器实例创建安全组规则,添加规则。不懂添加规则可以看阿里云教程
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 查看到的私有地址)
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。