c++ tcp 实时判断连接状态
时间: 2023-10-08 18:10:21 浏览: 406
C++ TCP客户端非阻塞连接超时测试源码
5星 · 资源好评率100%
要在C++中实时判断TCP连接的状态,可以使用套接字(socket)编程和非阻塞(non-blocking)模式。下面是一个简单的示例代码:
```cpp
#include <iostream>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <fcntl.h>
#include <unistd.h>
int main() {
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd == -1) {
std::cerr << "Failed to create socket" << std::endl;
return 1;
}
// 设置非阻塞模式
int flags = fcntl(sockfd, F_GETFL, 0);
fcntl(sockfd, F_SETFL, flags | O_NONBLOCK);
struct sockaddr_in server_addr;
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(80); // 替换为要连接的端口
server_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); // 替换为要连接的IP地址
// 连接服务器
int result = connect(sockfd, reinterpret_cast<struct sockaddr*>(&server_addr), sizeof(server_addr));
if (result == -1 && errno != EINPROGRESS) {
std::cerr << "Failed to connect" << std::endl;
close(sockfd);
return 1;
}
fd_set writefds;
FD_ZERO(&writefds);
FD_SET(sockfd, &writefds);
struct timeval timeout;
timeout.tv_sec = 5; // 设置超时时间为5秒
timeout.tv_usec = 0;
// 等待连接完成或超时
result = select(sockfd + 1, nullptr, &writefds, nullptr, &timeout);
if (result == -1) {
std::cerr << "Error occurred during select" << std::endl;
close(sockfd);
return 1;
} else if (result == 0) {
std::cout << "Connect timeout" << std::endl;
close(sockfd);
return 1;
}
// 检查连接状态
int error = 0;
socklen_t len = sizeof(error);
if (getsockopt(sockfd, SOL_SOCKET, SO_ERROR, &error, &len) == -1) {
std::cerr << "Failed to get socket option" << std::endl;
close(sockfd);
return 1;
}
if (error != 0) {
std::cerr << "Failed to connect: " << strerror(error) << std::endl;
close(sockfd);
return 1;
}
std::cout << "Connection successful" << std::endl;
// 连接成功后,可以继续进行其他操作
close(sockfd);
return 0;
}
```
在上面的代码中,我们首先创建一个套接字(socket),然后设置为非阻塞模式。接下来,我们使用`connect`函数连接到指定的服务器。如果连接立即建立成功,则连接状态为已连接。如果连接过程被阻塞,则使用`select`函数等待连接完成或超时。最后,使用`getsockopt`函数获取套接字选项,判断连接是否成功。
请注意,上述代码仅演示了如何实时判断TCP连接的状态,并没有处理数据的收发。如果需要进行数据交互,你需要在连接成功后,编写相应的数据发送和接收逻辑。
阅读全文