首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何获取服务器的主机名?

如何获取服务器的主机名?
EN

Stack Overflow用户
提问于 2015-12-18 03:51:10
回答 2查看 1.7K关注 0票数 2

我已经在C++中创建了一个服务器和客户端,我希望它们在同一网络上,但在不同的机器上运行时,能够相互连接。我目前正在使用以下代码来让服务器连接到网络:

代码语言:javascript
复制
#define HOST_PORT "27015"

WSADATA wsaData;
int status;
struct addrinfo * data;
struct addrinfo hints;

WSAStartup(MAKEWORD(2, 2), &wsaData);

ZeroMemory(&hints, sizeof(hints));
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_IP;
hints.ai_flags = AI_PASSIVE;

char hostname[1024];
hostname[1023] = '\0';
gethostname(hostname, 1023);

if (getaddrinfo(hostname, HOST_PORT, &hints, &data))
{
    std::cout << "Unable to translate host name to address\n";
    WSACleanup();

    return 1;
}

客户端尝试使用类似的代码进行连接:

代码语言:javascript
复制
#define DEFAULT_PORT "27015"

struct addrinfo hints;

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

char hostname[1024];
hostname[1023] = '\0';
gethostname(hostname, 1023);

struct addrinfo *result = NULL;
int iResult = getaddrinfo(hostname, DEFAULT_PORT, &hints, &result);

if (iResult != 0)
{
    std::cout << ("getaddrinfo failed with error: %d\n", iResult);
    WSACleanup();

    return false;
}

当客户机和服务器在同一台机器上时,这很好用,但是当它们在不同的机器上时,我如何允许它们连接呢?我希望在使用gettaddrinfo()时需要客户机连接到相同的主机名,但如何获得服务器的主机名?(例如,如果服务器上的hostname变为"InsertNameHere",如何允许客户端检测"InsertNameHere“并将其用作getaddrinfo()中的第一个参数?)

EN

回答 2

Stack Overflow用户

发布于 2015-12-18 05:19:56

您的问题相当常见,有几种方法可以解决这个问题。

手动配置

例如,您的服务器可能会找到它的IP4地址,将其打印到控制台,然后您可以在客户端应用程序中以某种方式手动指定该地址,例如作为命令行参数,或在某个配置文件中。

这是对开发人员最友好,但对用户最不友好的方式。

服务发布

您的服务器可能会在启动时将自身注册到客户端可以读取的某个位置。人们通常在企业Windows环境中实现这种方法,其中Active Directory就是“某个地方”。如果这是您的情况,请使用see this article获取您需要的WinSock API。

服务发现

或者,您可以自己实现发现机制,例如使用UDP广播。

在您的服务器中,侦听一些UDP端口,等待一些discover数据报,并以一些“discover”数据报作为响应。

在您的客户端中,在启动时,将发现UDP数据报发送到广播地址,发送到该UDP端口号。如果您的服务器运行在与客户端相同的子网上,则客户端将收到“discovered OK”消息。如果只有一个响应,您就知道只有一个可访问的服务器,您可以立即连接。如果有几个响应,这可能意味着有多个服务器,你可以询问用户连接到哪里。

这种方法很难正确实现(例如,UDP不提供有保证的交付,因此需要重试和超时),但它是最用户友好的方式。如果你曾经玩过像Quake这样的老式局域网游戏,他们就是这样发现他们的服务器的。

我想补充的是,你可以使用一些第三方的库,比如CollageReplicaNet,但是我没有使用这些库的实际经验,我不能推荐它们中的任何一个。

票数 2
EN

Stack Overflow用户

发布于 2015-12-18 04:28:54

要连接到远程服务器,您需要获取其IP地址或主机名。缺省方法是手动将其作为参数传递,或者使用ZooKeeper等命名服务(请参阅wiki)

最简单也是最好的方法是配置您的网络并使用DNS而不是直接的is (例如,myserver1.mycompany.com:27015,其中27015是一个TCP端口)。

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

https://stackoverflow.com/questions/34343108

复制
相关文章

相似问题

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