【发布时间】:2016-03-24 10:10:59
【问题描述】:
我在 C++ 中创建了一个服务器和客户端,我希望它们在同一网络上但在不同机器上运行时相互连接。我目前正在使用以下代码让服务器连接到网络:
#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;
}
客户端尝试使用类似代码进行连接:
#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()中的第一个参数?)
【问题讨论】:
-
客户端必须知道服务器的主机名或IP。
-
@CristiFati 那么如何让客户端和服务器在不同的机器上连接?
-
服务器正常。对于客户端,而不是调用
gethostname,您应该指定它(或者如果您愿意,可以从配置中读取它)。
标签: c++ sockets server client host