c++ - 如何在 C++ 中进行网络 IP 扫描?

标签 c++ winsockets

我正在试验 C++ winsockets。我想创建一种可以在不知道其 IP 的情况下在网络上找到服务器的方法。为此,我只需将我的连接方法通过 IP 地址 192.168.1.0 循环到 192.168.1.255。然而,每次连接之间的时间相当长,程序往往会在 connect(nBytes, (sockaddr*)&server, sizeof(server)) 语句处等待至少 30 秒,如果不长的话。我的问题如下:为什么会发生这种情况,我该如何解决这个问题,是否有一种完全不同的更好的方法来查找服务器?

我的连接方法:

SOCKET connect(char *ipAdress)
{
WSAData wsaData;

if ((WSAStartup(MAKEWORD(2, 2), &wsaData)) == SOCKET_ERROR)
    return errorReport("Could not create startup struct");

nBytes = socket(AF_INET, SOCK_STREAM, 0);

if (nBytes == SOCKET_ERROR)
    return errorReport("Socket could not be created");

struct hostent *host_entry;

if ((host_entry = gethostbyname(ipAdress)) == NULL)
    return errorReport("Cannot find server.");

struct sockaddr_in server;
server.sin_family = AF_INET;
server.sin_port = htons(1337);
server.sin_addr.s_addr = *(unsigned long*) host_entry->h_addr;

if (connect(nBytes, (sockaddr*)&server, sizeof(server)) == SOCKET_ERROR)
{
    WSACleanup();
    return errorReport("Failed to connect to server.");
}

if (nBytes == -1)
{
    WSACleanup();
    disconnect(nBytes); 
    return errorReport("Could not connect");
}

return 0;
}

此外,如果我在当前连接方法中做错了什么,请随时告诉我。

最佳答案

长时间的延迟是由于套接字在返回给调用者之前需要超时造成的。为了减少总执行时间,您应该让多个工作线程同时连接到单独的 IP 地址。

关于c++ - 如何在 C++ 中进行网络 IP 扫描?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/558610/

相关文章:

c++ - 访问 float cv::Mat 的元素

c++ - 在OpenCV中访问灰度图像的像素值

c++ - 在 C++ 中遍历非 STL 链表,可能吗?

C++/OpenGL - 2D - 如何在矩形边界框中剪辑一个圆

连接到xampp服务器上的index.php的C程序

c++ - 同一类中类型的前向声明

c++ - Winsocks 2异步问题

tcp - 接受来自恰好 2 个 IP 地址的 TCP 连接

套接字和多个 IP 地址