如何像a.b.c.d在 WINAPI中一樣列印服務器的 ip
int main(int argc, char ** argv)
{
if (argc < 3)
return -1;
WSADATA wsData;
int result;
struct addrinfo * client = NULL, *ptr = NULL, hints;
ZeroMemory(&hints, sizeof(hints));
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;
result = getaddrinfo(argv[1], argv[2], &hints, &ptr);
if (result < 0 )
return -1;
printf("%s", inet_addr(ptr->ai_addr->sa_data));
}
這會在執行時導致分段錯誤
uj5u.com熱心網友回復:
inet_addr()將點分 IPv4 格式的以空字符結尾的字串轉換為其二進制 32 位數字表示。例如,該數字適合存盤在 asockaddr_in中。這與你想要的相反。
ptr->ai_addr->sa_data不是以 null 結尾的字串,這就是inet_addr()崩潰的原因。
要將sockaddr_...結構中的 IP 地址(例如來自 的輸出getaddrinfo())轉換為其字串表示形式,您可以使用inet_ntop(),例如:
int main(int argc, char* argv[])
{
if (argc < 3)
return -1;
WSADATA wsData;
int result = WSAStartup(MAKEWORD(2,0), &wsData);
if (result != 0)
return -1;
struct addrinfo hints, *addrs, *ptr;
char ipStrBuf[50];
ZeroMemory(&hints, sizeof(hints));
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;
result = getaddrinfo(argv[1], argv[2], &hints, &addrs);
if (result != 0) {
WSACleanup();
return -1;
}
for (ptr = addrs; ptr != NULL; ptr = ptr->ai_next) {
switch (ptr->ai_addr->sa_family) {
case AF_INET: {
struct sockaddr_in *ip4 = (struct sockaddr_in *) ptr->ai_addr;
printf("%s", inet_ntop(AF_INET, &(ip4->sin_addr), ipStrBuf, sizeof(ipStrBuf)));
break;
}
case AFINET6: {
struct sockaddr_in6 *ip6 = (struct sockaddr_in6 *) ptr->ai_addr;
printf("%s", inet_ntop(AF_INET6, &(ip6->sin6_addr), ipStrBuf, sizeof(ipStrBuf)));
break;
}
}
}
freeaddrinfo(addrs);
WSACleanup();
return 0;
}
或者,您可以使用getnameinfo(),指定NI_NUMERICHOST標志,例如:
int main(int argc, char* argv[])
{
if (argc < 3)
return -1;
WSADATA wsData;
int result = WSAStartup(MAKEWORD(2,0), &wsData);
if (result != 0)
return -1;
struct addrinfo hints, *addrs, *ptr;
char ipStrBuf[50];
ZeroMemory(&hints, sizeof(hints));
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;
result = getaddrinfo(argv[1], argv[2], &hints, &addrs);
if (result != 0) {
WSACleanup();
return -1;
}
for (ptr = addrs; ptr != NULL; ptr = ptr->ai_next) {
result = getnameinfo(ptr->ai_addr, ptr->ai_addrlen, ipStrBuf, sizeof(ipStrBuf), NULL, 0, NI_NUMERICHOST);
if (result == 0) {
printf("%s", ipStrBuf);
}
}
freeaddrinfo(addrs);
WSACleanup();
return 0;
}
或者,您可以使用WSAAddressToString(),例如:
int main(int argc, char* argv[])
{
if (argc < 3)
return -1;
WSADATA wsData;
int result = WSAStartup(MAKEWORD(2,0), &wsData);
if (result != 0)
return -1;
struct addrinfo hints, *addrs, *ptr;
char ipStrBuf[50];
DWORD ipBufSize;
ZeroMemory(&hints, sizeof(hints));
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;
result = getaddrinfo(argv[1], argv[2], &hints, &addrs);
if (result != 0) {
WSACleanup();
return -1;
}
for (ptr = addrs; ptr != NULL; ptr = ptr->ai_next) {
ipBufSize = sizeof(ipStrBuf);
result = WSAAddressToStringA(ptr->ai_addr, ptr->ai_addrlen, NULL, ipStrBuf, &ipBufSize);
if (result == 0) {
printf("%s", ipStrBuf);
}
}
freeaddrinfo(addrs);
WSACleanup();
return 0;
}
或者,您可以使用RtlIpv4AddressToString()and RtlIpv6AddressToString(),例如:
int main(int argc, char* argv[])
{
if (argc < 3)
return -1;
WSADATA wsData;
int result = WSAStartup(MAKEWORD(2,0), &wsData);
if (result != 0)
return -1;
struct addrinfo hints, *addrs, *ptr;
char ipStrBuf[50];
ZeroMemory(&hints, sizeof(hints));
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;
result = getaddrinfo(argv[1], argv[2], &hints, &addrs);
if (result != 0) {
WSACleanup();
return -1;
}
for (ptr = addrs; ptr != NULL; ptr = ptr->ai_next) {
switch (ptr->ai_addr->sa_family) {
case AF_INET: {
struct sockaddr_in *ip4 = (struct sockaddr_in *) ptr->ai_addr;
printf("%s", RtlIpv4AddressToStringA(&(ip4->sin_addr), ipStrBuf));
break;
}
case AFINET6: {
struct sockaddr_in6 *ip6 = (struct sockaddr_in6 *) ptr->ai_addr;
printf("%s", RtlIpv6AddressToStringA(&(ip6->sin6_addr), ipStrBuf));
break;
}
}
}
freeaddrinfo(addrs);
WSACleanup();
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/527479.html
標籤:C温纳皮温索克2
