【问题标题】:C++ socket Connect is stuck when trying to connect to a unreachable computer尝试连接到无法访问的计算机时,C++ 套接字连接卡住
【发布时间】:2018-05-13 09:32:51
【问题描述】:

源代码:

    bool Helper::connectToAComputer(char* destIpString, char* srcIpString)
{
    int iResult = 0;
    u_long iMode = 1;
    SOCKET ConnectSocket = INVALID_SOCKET;
    ConnectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (ConnectSocket == INVALID_SOCKET) 
    {
        wprintf(L"socket function failed with error: %ld\n", WSAGetLastError());
        //return NULL;
    }

    sockaddr_in clientService;
    clientService.sin_family = AF_INET;
    clientService.sin_addr.s_addr = inet_addr(destIpString);
    clientService.sin_port = htons(22223);

    iResult = connect(ConnectSocket, (SOCKADDR *)& clientService, sizeof(clientService));
    if (iResult == SOCKET_ERROR)
    {
        wprintf(L"connect function failed with error: %ld\n", WSAGetLastError());
    }

    closesocket(ConnectSocket);
    return false;
}

我正在编写一个程序,它将检查所有本地 IP 地址以查看本地网络上的计算机或设备。我已经编写了这个连接到套接字的函数。

问题在于,当套接字尝试连接到不属于任何设备的 IP 时,程序只是停止并在连接线上等待。它可以连接到计算机拥有的 IP。我希望函数告诉我连接是否不成功,而不是只是挂起等待。

【问题讨论】:

  • TCP 无法在不等待超时的情况下判断该地址不可访问。不清楚你想从中得到什么。
  • 我明白你的意思,谢谢你的回答。那么如何检查地址是否可达?
  • 这不是一项简单的任务。您可以从 ICMP 和 ping 开始。但如果是远程主机 ICMP 可以被路由器阻止。最好使用nmap程序。
  • ' 那么如何检查地址是否可达? - 尝试连接到它。没有好的选择。如果必要的 TCP 超时导致问题,请使用异步/重叠设计或多线程。

标签: c++ sockets networking ip


【解决方案1】:

大约一分钟后超时。您可以通过使用非阻塞模式和select() 来减少这种情况,以便在连接后超时。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-12
    • 2017-11-22
    • 1970-01-01
    • 1970-01-01
    • 2012-09-30
    相关资源
    最近更新 更多