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()......
}
}