昨天晚上在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调试连接上了,也能发送数据了,如下图:
发送数据时最好把“十六进制格式“ 的勾去掉,要不然显示出奇怪的数据。。