我正在尝试使用C++ winsockets。我想创建一种方法,使我可以找到网络上的服务器,而不需要知道它的IP。为此,我只需通过IP地址192.168.1.0到192.168.1.255循环我的connect方法。但是,每次连接之间的时间非常长,程序往往会在: connect(nBytes,(sockaddr*)&server,sizeof(server))语句中等待至少30秒。我的问题如下:为什么会发生这种情况,我如何解决这个问题,是否有一种完全不同的更好的方法来找到服务器?
我的connect方法:
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方法中做错了什么,请随时告诉我。
发布于 2009-02-17 20:42:59
长延迟是由于套接字在返回调用方之前需要超时造成的。为了减少总的执行时间,您应该使多个工作线程同时连接到不同的IP地址。
发布于 2009-02-17 20:48:21
好了,这里有几件事。
首先,connect被设计为在服务器繁忙的情况下等待一段时间后超时。你可以调整超时时长,尽管我已经记不清该怎么做了。
其次,你的代码会找到一个服务器,但是你怎么知道它就是你要找的服务器呢?它可能是一些其他的应用程序,只是在同一个端口上侦听。除非您只是对特定的服务器进行扫描,否则需要进行一些验证,以确定您正在与另一端的谁交谈。
最后,假设您正在编写客户端和服务器,一个更好的解决方案是让客户端发送一个广播/多播消息,并让服务器(如果有多个服务器)侦听并响应该消息。然后,客户端只需等待一段指定的时间,等待响应确定服务器在哪里。
发布于 2009-02-17 20:47:42
我会做一个研究,看看winsock是否支持异步I/O。
https://stackoverflow.com/questions/558610
复制相似问题