Có cửa sổ tích hợp chức năng gọi C++ có thể nhận tên máy chủ và địa chỉ IP không? Cảm ơn.C++ Gọi hàm Windows có tên máy chủ cục bộ và địa chỉ IP
Trả lời
Để có được tên máy bạn có thể sử dụng: gethostname hoặc phương pháp async WSAAsyncGetHostByName
Để có được thông tin địa chỉ, bạn có thể sử dụng: getaddrinfo hoặc phiên bản unicode GetAddrInfoW
Bạn có thể tìm thêm thông tin về máy tính tên giống như tên miền bằng cách sử dụng API Win32: .
Đây là giải pháp đa nền tảng ... Windows, Linux và MacOSX. Bạn có thể lấy địa chỉ ip, cổng, sockaddr_in, cổng.
BOOL GetMyHostName(LPSTR pszBuffer, UINT nLen)
{
BOOL ret;
ret = FALSE;
if (pszBuffer && nLen)
{
if (gethostname(pszBuffer, nLen) == 0)
ret = TRUE;
else
*pszBuffer = '\0';
}
return ret;
}
ULONG GetPeerName(SOCKET _clientSock, LPSTR _pIPStr, UINT _IPMaxLen, int *_pport)
{
struct sockaddr_in sin;
unsigned long ipaddr;
ipaddr = INADDR_NONE;
if (_pIPStr && _IPMaxLen)
*_pIPStr = '\0';
if (_clientSock!=INVALID_SOCKET)
{
#if defined(_WIN32)
int locallen;
#else
UINT locallen;
#endif
locallen = sizeof(struct sockaddr_in);
memset(&sin, '\0', locallen);
if (getpeername(_clientSock, (struct sockaddr *) &sin, &locallen) == 0)
{
ipaddr = GetSinIP(&sin, _pIPStr, _IPMaxLen);
if (_pport)
*_pport = GetSinPort(&sin);
}
}
return ipaddr;
}
ULONG GetSinIP(struct sockaddr_in *_psin, LPSTR pIPStr, UINT IPMaxLen)
{
unsigned long ipaddr;
ipaddr = INADDR_NONE;
if (pIPStr && IPMaxLen)
*pIPStr = '\0';
if (_psin)
{
#if defined(_WIN32)
ipaddr = _psin->sin_addr.S_un.S_addr;
#else
ipaddr = _psin->sin_addr.s_addr;
#endif
if (pIPStr && IPMaxLen)
{
char *pIP;
struct in_addr in;
#if defined(_WIN32)
in.S_un.S_addr = ipaddr;
#else
in.s_addr = ipaddr;
#endif
pIP = inet_ntoa(in);
if (pIP)
adjust_str(pIP, pIPStr, IPMaxLen);
}
}
return ipaddr;
}
int GetSinPort(struct sockaddr_in *_psin)
{
int port;
port = 0;
if (_psin)
port = _Xntohs(_psin->sin_port);
return port;
}
Điều này thật tuyệt vời, cảm ơn rất nhiều! – Stan
cách kiểm tra chức năng GetSinIP của bạn? –
Xin lưu ý rằng tên máy chủ được trả về bởi 'gethostname()' là ** không ** nhất thiết phải là tên được trả về bởi độ phân giải tên miền cho bất kỳ giao diện của máy chủ nào! Tuy nhiên, ** có thể ** có cùng tên, nếu được định cấu hình theo cách này. – alk
gethostname(), getaddrinfo() – WhirlWind