TCP服务端 accept()函数实现非阻塞

1、首先使用fcntl函数设置socket为非阻塞

      sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

      int flags = fcntl(sockfd, F_GETFL, 0);

      fcntl(sockfd, F_SETFL, flags | O_NONBLOCK);

      bind()......

      listen()......

2、再使用select函数设置超时

      FD_ZERO(&rdset); 

      FD_SET(sockfd, &rdset);

      ret = select(sockfd + 1, &rdset, NULL, NULL, &timeout);

      if(ret > 0)

      {

            FD_CLR(sockfd, &rdset);

            revSocket = accept(sockfd, (struct sockaddr *)&client, &addrlen);

            if(revSocket >= 0)

            {

                ret = setsockopt(revSocket, SOL_SOCKET, SO_RCVTIMEO, (char *)&nTimeout, sizeof(int)); // 接收超时

                recv()......

            }

      }

猜你喜欢

转载自blog.csdn.net/zhiyijue7762/article/details/115378116