#include <stdbool.h>
#include <ctype.h>
#include <stdio.h>
#include <netdb.h>
#include <sys/socket.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <arpa/inet.h>
bool server_is_ip(char *server)
{
char ip[4][4] = {0};
int ip_i = 0;
char *ptr = server;
int ptr_i = 0;
int ptr_len = strlen(server);
if (NULL == server || 15 < ptr_len)
return false;
//检查IP范围
for (int i=0; i<4; i++)
{
ip_i = 0;
for(int j=0; j<4; j++)
{
//1.字符为0-9的数字
if (3 != j && isdigit(ptr[ptr_i]))
{
ip[i][ip_i++] = ptr[ptr_i++];
}
//2.字符为'.'分隔符
else if (3 != i && 0 != j && '.' == ptr[ptr_i])
{
ip[i][ip_i++] = '\0';
ptr_i++;
break;
}
else
{
return false;
}
//3.结束
if (ptr_len <= ptr_i)
{
if (3 == i)
break;
else
return false;
}
}
}
//检查IP格式
for (int z=0; z<4; z++)
if (atoi(ip[z]) > 255)
return false;
return true;
}
/*
Get ip from domain name (gethostbyname)
int hostname_to_ip(char * , char *);
*/
int hostname_to_ip(const char *hostname, char *ip_address)
{
struct addrinfo hints, *res;
int status;
memset(&hints, 0, sizeof hints);
hints.ai_family = AF_INET; // IPv4
hints.ai_socktype = SOCK_STREAM; // TCP
if ((status = getaddrinfo(hostname, NULL, &hints, &res)) != 0) {
fprintf(stderr, "getaddrinfo error: %s\n", gai_strerror(status));
return 1;
}
struct sockaddr_in *ipv4 = (struct sockaddr_in *)res->ai_addr;
inet_ntop(AF_INET, &(ipv4->sin_addr), ip_address, INET_ADDRSTRLEN);
freeaddrinfo(res); // free the linked list
return 0;
}
域名转为ip是chatGPT写的。