连接服务器的TCP速度慢?

时间:2015-11-14 13:00:35

标签: c++ sockets tcp winsock2

我正在运行一个快速接受Java客户端的TCP服务器。但是c ++ Client确实需要~1Second来连接它。 (使用范围时间记录器)我做的是,我连接到服务器发送和通信完成我关闭套接字,下次我发送的东西我做相同的程序。

连接到套接字的for循环真的很慢。我该如何改进?! (连线很慢)

它是客户端还是meight它是服务器?如果它可能是服务器,我想知道为什么如果一个Java客户端连接它不是很慢

bool JIMDBClient::connect()
{
    WSADATA wsaData;
    m_sock = INVALID_SOCKET;
    struct addrinfo* result = nullptr, *ptr = nullptr, hints;

    int iResult;

    /* Initialisiere TCP für Windows ("winsock"). */
    WORD wVersionRequested;

    // Initialize Winsock
    iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (iResult != 0)
    {
        printf("WSAStartup failed with error: %d\n", iResult);
        m_connected = false;
        return false;
    }

    ZeroMemory(&hints, sizeof(hints));
    hints.ai_family = AF_UNSPEC;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_protocol = IPPROTO_TCP;

    // Resolve the server address and port
    iResult = getaddrinfo(m_host.c_str(), m_port.c_str(), &hints, &result);
    if (iResult != 0)
    {
        printf("getaddrinfo failed with error: %d\n", iResult);
        WSACleanup();
        m_connected = false;
        return false;
    }

    // Attempt to connect to an address until one succeeds
    for (ptr = result; ptr != nullptr; ptr = ptr->ai_next) // this is slow
    {
        // Create a SOCKET for connecting to server
        m_sock = socket(ptr->ai_family, ptr->ai_socktype,
                        ptr->ai_protocol);
        if (m_sock == INVALID_SOCKET)
        {
            printf("socket failed with error: %ld\n", WSAGetLastError());
            WSACleanup();
            m_connected = false;
            return false;
        }

        // Connect to server.
        iResult = ::connect(m_sock, ptr->ai_addr, static_cast<int>(ptr->ai_addrlen));
        if (iResult == SOCKET_ERROR)
        {
            closesocket(m_sock);
            m_sock = INVALID_SOCKET;
            continue;
        }
        break;
    }

    freeaddrinfo(result);

    if (m_sock == INVALID_SOCKET)
    {
        WSACleanup();
        m_connected = false;
        return false;
    }

    if(!handShake()) //only takes around 450µS !
    {
        LOG_WARN << "handshake failed";
        WSACleanup();
        m_connected = false;
        return false;
    }

    m_connected = true;
    return m_connected;
}

1 个答案:

答案 0 :(得分:1)

如果您知道您的服务器仅支持IPv4或IPv6,您可以在传递给getaddrinfo的提示中说明:

hints.ai_family = AF_INET; // Or AF_INET6