我们如何检查我们是否有有效的连接?

时间:2015-03-24 20:05:41

标签: c++ sockets

我正在使用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}}功能)。我们如何检查我们是否有有效连接?

1 个答案:

答案 0 :(得分:1)

在TCP中可靠地检测断开的连接的唯一方法是尝试写入它。如果连接断开,最终会导致send()返回-1 errno == ECONNRESET.它在第一次写入时不会发生,并且可能需要多次写入(或者在读取之后读取)第一次这样写)因为缓冲。

您可以使用读取超时检测可能断开的连接。但是,超时值的选择取决于许多因素,读取超时可能意味着在系统当前状态下超时对于请求来说太短了。