标签:lfd addr clientfd int epoll 连不上 TCP centos7 epfd
昨天晚上在centos7上写好了服务端(练习用的)代码后,然后启动之后。用TCP调试工具连接一直断开的。
一:代码如下
#define EPOLL_SIZE 1024
int main()
{
int lfd=socket(AF_INET,SOCK_STREAM,0);
//lfd是要监听的fd
if(lfd<0)
{
return -1;
}
int opt=1;
setsockopt(lfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(int)); //端口复用
struct sockaddr_in serv_addr;
memset(&serv_addr,0x0,sizeof(sockaddr_in));
serv_addr.sin_family=AF_INET;
serv_addr.sin_port=htons(6999);
serv_addr.sin_addr.s_addr=INADDR_ANY;
//将lfd和端口绑定
if(bind(lfd,(struct sockaddr *)&serv_addr,sizeof(serv_addr))<0)
{
perror("bind fail");
return -2;
}
if(listen(lfd,5)<0)
{
perror("listen error");
return -3;
}
//使用epoll得创建一个根epfd,然后将所要监听得lfd加入到树中(也就是挂到以epfd为根得红黑树中)
int epfd=epoll_create(1024);
struct epoll_event ev,events[EPOLL_SIZE]={0};
ev.events=EPOLLIN ;
ev.data.fd=lfd;
epoll_ctl(epfd,EPOLL_CTL_ADD,lfd,&ev);
while(1)
{ //-1表示一直阻塞,nready表示当前监听得fd里面产生事件得个数
int nready=epoll_wait(epfd,events,EPOLL_SIZE,-1);
if(nready==-1)
{
if(errno==EINTR) //EINTR表示来信号
{
continue;
}
break;
}
int i=0;
for(i=0;i<nready;i++)
{
if(events[i].data.fd==lfd) //监听到有新得客户端连接过来
{
struct sockaddr_in clientaddr;
socklen_t client_len=sizeof(clientaddr);
int clientfd=accept(lfd,(struct sockaddr*)&clientaddr,&client_len);
if(clientfd<0)
{
continue;
}
ev.events=EPOLLIN;
ev.data.fd=clientfd;
epoll_ctl(epfd,EPOLL_CTL_ADD,clientfd,&ev); //将新得客户端加入到epoll树
printf("sockfd:%d,clientfd:%d\n",lfd,clientfd);
}
else
{
int clientfd=events[i].data.fd;
char buffer[1024]={0};
int ret=recv(clientfd,buffer,5,0);
printf("recv the data from the clientfd ret=%d\r\n",ret);
if(ret<0)
{
if(errno==EAGAIN ||errno==EWOULDBLOCK)
{
printf("read all data\r\n");
continue;
}
else
{
close(clientfd);
epoll_ctl(epfd,EPOLL_CTL_DEL,clientfd,NULL);
}
}
else if(ret==0) //表示客户端断开连接
{
printf("disconnect %d\r\n",i);
epoll_ctl(epfd, EPOLL_CTL_DEL, clientfd, NULL);
break;
}
else
{
printf("Recv :%s %d Bytes \r\n",buffer,ret);
}
}
}
}
}
二:然后编译 g++ -o mynetwork mynetwork.cpp ;生成mynetwork可执行文件,然后启动
接着用tcp调试工具一直连接不上。我通过netstat -lnpt|grep 6999,看到程序是启动得了,也就是端口打开了。如图:
三:后面我就多试了几次,还是不行。我想起来我得这个centos7装没有多久。防火墙估计还是打开得。通过如下命令查看
systemctl status firewalld.service ,看到是active的。
然后把防火墙直接关掉
systemctl stop firewalld.service
四:关了防火墙之后,通过tcp调试连接上了,也能发送数据了,如下图:
发送数据时最好把“十六进制格式“ 的勾去掉,要不然显示出奇怪的数据。。
标签:lfd,addr,clientfd,int,epoll,连不上,TCP,centos7,epfd 来源: https://www.cnblogs.com/Unclebigdata/p/16535982.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。