c++ 判断网络连接断开
时间: 2023-08-03 15:22:41 浏览: 159
QT TCP服务端如何判断客户端已断开连接 - 北冥有鱼的博客 - CSDN博客1
在 C++ 中判断网络连接是否断开可以通过以下步骤实现:
1. 使用 WinSock 库提供的函数创建一个套接字(Socket)。
2. 调用 connect 函数连接服务器。
3. 调用 select 函数监视套接字上的读事件和写事件,如果返回值大于 0 则表示有事件发生。
4. 调用 recv 函数接收数据,如果返回值小于等于 0 则表示连接已经断开。
以下是一个简单的示例代码:
```c++
#include <winsock2.h>
#include <iostream>
#pragma comment(lib, "ws2_32.lib")
int main()
{
WSADATA wsaData;
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
std::cerr << "WSAStartup failed\n";
return 1;
}
SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (s == INVALID_SOCKET) {
std::cerr << "socket failed\n";
return 1;
}
sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(80);
addr.sin_addr.s_addr = inet_addr("192.168.1.1");
if (connect(s, (sockaddr*)&addr, sizeof(addr)) == SOCKET_ERROR) {
std::cerr << "connect failed\n";
closesocket(s);
WSACleanup();
return 1;
}
fd_set readfds, writefds;
timeval timeout;
timeout.tv_sec = 5;
timeout.tv_usec = 0;
while (true) {
FD_ZERO(&readfds);
FD_ZERO(&writefds);
FD_SET(s, &readfds);
FD_SET(s, &writefds);
int ret = select(0, &readfds, &writefds, NULL, &timeout);
if (ret == SOCKET_ERROR) {
std::cerr << "select failed\n";
break;
}
else if (ret == 0) {
std::cout << "timeout\n";
break;
}
else {
if (FD_ISSET(s, &readfds)) {
char buf[1024];
int len = recv(s, buf, sizeof(buf), 0);
if (len <= 0) {
std::cout << "connection closed\n";
break;
}
}
if (FD_ISSET(s, &writefds)) {
// do something
}
}
}
closesocket(s);
WSACleanup();
return 0;
}
```
以上代码中的 IP 地址和端口号需要根据实际情况进行修改。
阅读全文