我正在使用winsock来实现我的简单客户端应用程序,并提出了一个关于检查活动连接的问题。让我提供一段代码:
class Connection
{
private:
SOCKET socket_;
public:
void connect(const char* host, const int& port);
//other member functions
}
void Connection::connect(const char* host, const int& port)
{
socket_ = INVALID_SOCKET;
WSAData wsaData;
WSAStartup(MAKEWORD(2, 2), &wsaData);
addrinfo hints = addrinfo(), *result;
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;
if(getaddrinfo(host, std::to_string(port).c_str() != 0, &hints, &result)
{
throw std::exception("Address initialization failed\n");
}
for(ptr = result; ptr != NULL; ptr = ptr->ai_next)
{
socket_ = socket(ptr->ai_family,
ptr->ai_socktype, ptr->ai_protocol); //1
if(socket_ = INVALID_SOCKET){
continue;
}
connect(socket_, ptr->ai_addr, ptr->ai_addrlen); //2
break;
}
}
我需要检查一下是否有活动连接。事实是socket_ != INVALID_SOCKET
并不意味着我们没有活动连接(例如,在获取有效套接字值之后//1
之间和//2
之间调用{ {1}}功能)。我们如何检查我们是否有有效连接?
答案 0 :(得分:1)
在TCP中可靠地检测断开的连接的唯一方法是尝试写入它。如果连接断开,最终会导致send()
返回-1 errno == ECONNRESET.
它在第一次写入时不会发生,并且可能需要多次写入(或者在读取之后读取)第一次这样写)因为缓冲。
您可以使用读取超时检测可能断开的连接。但是,超时值的选择取决于许多因素,读取超时可能意味着在系统当前状态下超时对于请求来说太短了。