首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在c++中进行网络ip扫描?

如何在c++中进行网络ip扫描?
EN

Stack Overflow用户
提问于 2009-02-17 20:36:40
回答 7查看 8K关注 0票数 0

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

我的connect方法:

代码语言:javascript
复制
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;
}

另外,如果我在当前的connect方法中做错了什么,请随时告诉我。

EN

回答 7

Stack Overflow用户

发布于 2009-02-17 20:42:59

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

票数 3
EN

Stack Overflow用户

发布于 2009-02-17 20:48:21

好了,这里有几件事。

首先,connect被设计为在服务器繁忙的情况下等待一段时间后超时。你可以调整超时时长,尽管我已经记不清该怎么做了。

其次,你的代码会找到一个服务器,但是你怎么知道它就是你要找的服务器呢?它可能是一些其他的应用程序,只是在同一个端口上侦听。除非您只是对特定的服务器进行扫描,否则需要进行一些验证,以确定您正在与另一端的谁交谈。

最后,假设您正在编写客户端和服务器,一个更好的解决方案是让客户端发送一个广播/多播消息,并让服务器(如果有多个服务器)侦听并响应该消息。然后,客户端只需等待一段指定的时间,等待响应确定服务器在哪里。

票数 3
EN

Stack Overflow用户

发布于 2009-02-17 20:47:42

我会做一个研究,看看winsock是否支持异步I/O。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/558610

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档