博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
gethostbyname与sockaddr_in的完美组合
阅读量:4324 次
发布时间:2019-06-06

本文共 1232 字,大约阅读时间需要 4 分钟。

我们在winsock编程中常常会向指定url地址进行连接,但是这个必须通过url后面对应的ip地址实现。在获取urlip的时候,我们使用gethostbyname得到hostent指针,然后把hostent指针转换成in_addr结构,因为sockaddr_in的结构如下:

struct sockaddr_in {  

short int sin_family; /* Address family */  

unsigned short int sin_port; /* Port number */  

struct  sin_addr; /* Internet address */  

unsigned char sin_zero[8]; /* Same size as struct sockaddr */  

}; 

 

这个in_addr结构可以直接赋值给sockaddr_in结构体的sin_addr。这样,我们的winsock地址就实现啦!下面对这个具体实现进行分析:

首先,我们了解ip地址的本质。按照Tcp/IP协议规定,IP地址用二进制表示,每个IP地址长32bit,也就是4个字节。例如,一个采用二进制形式表示的IP地址是00001010000000000000000000000001 ,如果用IP地址表示,他就是10.0.0.1 ,后面的好记多啦!我们称后面这种为“点分十进制表示法 。

我们在gethostbyname中取得的host结构如下

struct hostent {  

char *h_name;   h_name – 地址的正式名称。 

char **h_aliases;   空字节-地址的预备名称的指针。 

int h_addrtype;   h_addrtype 地址类型通常是AF_INET 

int h_length;   地址的比特长度 

char **h_addr_list;   零字节-主机网络地址指针。网络字节顺序。 

}; 

#define h_addr h_addr_list中的第一地址。 

在这个里面,h_addr_list就是IP地址的二进制表示,同时in_addr的结构

其实,我们存储在内存中的in_addr也是以二进制表示的IP地址,那么,我们从hostentin_addr结构,就可以简单使用memmove(&in_addr,hostetn->h_addr,hostent->h_length);

怎么样,这样转换很简单吧,搞懂原理,这个过程实现很高效哦,其实了,还有跟高效的,不是么?

Memmove(&(sockaddr_in->sin_addr),hosten->h_addr,hostent->h_length);

是不是很简单呢?

转载于:https://www.cnblogs.com/imhurley/archive/2011/11/20/2255725.html

你可能感兴趣的文章
性能优化之数据库优化
查看>>
linux 系统下 tar 的压缩与解压缩命令
查看>>
阿里负载均衡,配置中间证书问题(在starcom申请免费DV ssl)
查看>>
转:How to force a wordbreaker to be used in Sharepoint Search
查看>>
MySQL存储过程定时任务
查看>>
Python中and(逻辑与)计算法则
查看>>
POJ 3267 The Cow Lexicon(动态规划)
查看>>
设计原理+设计模式
查看>>
音视频处理
查看>>
tomcat 7服务器跨域问题解决
查看>>
前台实现ajax 需注意的地方
查看>>
Jenkins安装配置
查看>>
个人工作总结05(第二阶段)
查看>>
Java clone() 浅拷贝 深拷贝
查看>>
深入理解Java虚拟机&运行时数据区
查看>>
02-环境搭建
查看>>
spring第二冲刺阶段第七天
查看>>
搜索框键盘抬起事件2
查看>>
阿里百川SDK初始化失败 错误码是203
查看>>
透析Java本质-谁创建了对象,this是什么
查看>>