关于域名向ip地址的转换

maosharen 2016-10-22 05:02:02

char *dest = "www.baidu.com";
struct hostent *ht=NULL;
ht = gethostbyname(dest);
unsigned int ip = *(unsigned long *)ht->h_addr_list[0];

struct sockaddr_in server_addr;
bzero(&server_addr,sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = ip;
server_addr.sin_port = 80;

if(connect(s,(struct sockaddr*)&server_addr,sizeof(struct sockaddr))){
perror("connect");
exit(1);
}

以上代码用于连接服务器,其中使用了gethostbyname函数进行了主机名向IP地址的转换,但是假如dest变量本来就是ip地址,例如:http://119.90.25.43,那么应该怎么写呢?保持不变吗?
...全文
497 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Dobzhansky 2016-10-24
  • 打赏
  • 举报
回复
LPTSTR s = "192.168.0.1";//"www.baidu.com"
sockaddr_in6 sin6;
sockaddr_in sin4;
int slen;
slen = sizeof(sin6);

if (WSAStringToAddress(s, AF_INET6, 0, (sockaddr *)&sin6, &slen) == 0) {
//ipv6 的地址
} else {
slen = sizeof(sin4);
if (WSAStringToAddress((PTSTR)s, AF_INET, 0, (sockaddr *)&sin4, &slen) == 0) {
//ipv4的地址
} else {
//如果给出的是域名, 上面调用会失败
addrinfo hints={}, *res=NULL;
hints.ai_socktype = SOCK_STREAM;
hints.ai_family = AF_INET;
char* p = 0;
#ifdef UNICODE
p = ConvertToMBCS(s);
#else
p = s;
#endif
if (getaddrinfo(p, NULL, &hints, &res) == 0) {
//ipv4 地址获取成功
freeaddrinfo(res);
} else {
hints.ai_family = AF_INET6;
if (getaddrinfo(p, NULL, &hints, &res) == 0) {
//ipv6
freeaddrinfo(res);
}
}
}
}
Dobzhansky 2016-10-24
  • 打赏
  • 举报
回复
域名解析用
getaddrinfo
赵4老师 2016-10-24
  • 打赏
  • 举报
回复
仅供参考:
#include <stdio.h>
int main() {
    int IP[4];
    int i;
    char c;

    printf("请输入一个ip地址:");fflush(stdout);
    while (1) {
        rewind(stdin);
        if (5==scanf("%d.%d.%d.%d%c",&IP[0],&IP[1],&IP[2],&IP[3],&c)) {
            if (0<=IP[0] && IP[0]<=255
             && 0<=IP[1] && IP[1]<=255
             && 0<=IP[2] && IP[2]<=255
             && 0<=IP[3] && IP[3]<=255
             && '\n'==c) {
                break;
            } else printf("输入的ip地址格式不对!\n请重新输入:\n");
        } else printf("输入的ip地址格式不对!\n请重新输入:\n");
    }
    for (i=0;i<4;i++) {
        printf("IP[%d]=%d\n",i,IP[i]);
    }
    return 0;
}
再供参考:
#include <stdio.h>
char s[]="123 ab 4";
char *p;
int v,n,k;
void main() {
    p=s;
    while (1) {
        k=sscanf(p,"%d%n",&v,&n);
        printf("k,v,n=%d,%d,%d\n",k,v,n);
        if (1==k) {
            p+=n;
        } else if (0==k) {
            printf("skip char[%c]\n",p[0]);
            p++;
        } else {//EOF==k
            break;
        }
    }
    printf("End.\n");
}
//k,v,n=1,123,3
//k,v,n=0,123,3
//skip char[ ]
//k,v,n=0,123,3
//skip char[a]
//k,v,n=0,123,3
//skip char[b]
//k,v,n=1,4,2
//k,v,n=-1,4,2
//End.
  • 打赏
  • 举报
回复
http://119.90.25.43 这种不是域名,本来就是ip地址,不用转。
如果是域名,向dns发送一个请求就行了。
你可以写个函数判断一些http://后面的内容是否ip地址,是就不处理,这个比较简单。
oyljerry 2016-10-24
  • 打赏
  • 举报
回复
本身IP,api应该会直接返回
Yofoo 2016-10-23
  • 打赏
  • 举报
回复
"http://119.90.25.43" 这个是http的地址, 不是域名, 你用"119.90.25.43" 也是可以的
maosharen 2016-10-22
  • 打赏
  • 举报
回复
我试了下,发现获取的IP值不同,但是我又不知道怎么写
vcf_reader 2016-10-22
  • 打赏
  • 举报
回复
先试试不就知道了么?

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧