在使用accept()函数时,如果没有连接请求,它会阻塞程序执行,并且在有连接请求时才会返回。因此,它不会返回SOCKET_ERROR。如果您希望在没有连接请求时立即返回,您可以使用非阻塞模式来设置套接字。
以下是一个使用非阻塞套接字的示例代码:
#include
#include
#include
#include
#include
int main() {
int serverSocket = socket(AF_INET, SOCK_STREAM, 0);
if (serverSocket == -1) {
std::cerr << "Failed to create socket" << std::endl;
return 1;
}
// 设置套接字为非阻塞模式
int flags = fcntl(serverSocket, F_GETFL, 0);
if (flags == -1) {
std::cerr << "Failed to get socket flags" << std::endl;
return 1;
}
fcntl(serverSocket, F_SETFL, flags | O_NONBLOCK);
sockaddr_in serverAddress{};
serverAddress.sin_family = AF_INET;
serverAddress.sin_addr.s_addr = INADDR_ANY;
serverAddress.sin_port = htons(12345);
if (bind(serverSocket, reinterpret_cast(&serverAddress), sizeof(serverAddress)) == -1) {
std::cerr << "Failed to bind socket" << std::endl;
return 1;
}
if (listen(serverSocket, 5) == -1) {
std::cerr << "Failed to listen on socket" << std::endl;
return 1;
}
while (true) {
int clientSocket = accept(serverSocket, nullptr, nullptr);
if (clientSocket == -1) {
std::cout << "No connection request" << std::endl;
} else {
std::cout << "Connection accepted" << std::endl;
// 处理客户端连接
close(clientSocket);
}
// 延时一段时间以避免循环过于频繁
usleep(100000);
}
close(serverSocket);
return 0;
}
在上述代码中,我们通过调用fcntl()函数来获取并设置套接字的标志,将其设置为非阻塞模式。然后,我们使用accept()函数来接受连接请求。如果没有连接请求,accept()函数将返回-1,并打印"No connection request"。如果有连接请求,accept()函数将返回客户端套接字,并打印"Connection accepted"。请注意,为了避免循环过于频繁,我们在每次循环中使用usleep()函数来延时一段时间。