系统相关
首页 > 系统相关> > centos7上写好运行的服务器代码,用TCP调试工具连不上问题

centos7上写好运行的服务器代码,用TCP调试工具连不上问题

作者:互联网

  昨天晚上在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