sockaddr与sockaddr_in(2011-09-07 23:17:17)转载▼标签: ip地址结构体数据结构字节顺序进行sockaddrsockaddr_init 分类: 技术档案

struct sockaddr {

unsigned short sa_family;

char sa_data[14];

};

此数据结构用做bind、connect、recvfrom、sendto等函数的参数,指明地址信息。

但一般编程中并不直接针对此数据结构操作,而是使用另一个与sockaddr等价的数据结构

sockaddr_in(在netinet/in.h中定义):

struct sockaddr_in {

short int sin_family;

unsigned short int sin_port;

struct in_addr sin_addr;

unsigned char sin_zero[8];

};

struct in_addr {

unsigned long s_addr;

};

typedef struct in_addr {

union {

struct{

unsigned char s_b1,

s_b2,

s_b3,

s_b4;

} S_un_b;

struct{

unsigned short s_w1,

s_w2;

} S_un_w;

unsigned long S_addr;

}S_un;

} IN_ADDR;

sin_family指代协议族,在socket编程中只能是AF_INET

sin_port存储端口号(使用网络字节顺序)

sin_addr存储IP地址,使用in_addr这个数据结构

sin_zero是为了让sockaddr与sockaddr_in两个数据结构保持大小相同而保留的空字节。

s_addr按照网络字节顺序存储IP地址

sockaddr_in和sockaddr是并列的结构,指向sockaddr_in的结构体的指针也可以指向

sockadd的结构体,并代替它。也就是说,你可以使用sockaddr_in建立你所需要的信息,

在最后用进行类型转换就可以了bzero((char*)&mysock,sizeof(mysock));//初始化

mysock结构体名

mysock.sa_family=AF_INET;

mysock.sin_addr.s_addr=inet_addr("192.168.0.1");

……

等到要做转换的时候用:

(struct sockaddr*)mysock

想来你是要进行网络编程,使用socket, listen, bind等函数。

你只要记住,填值的时候使用sockaddr_in结构,而作为函数的参数传入的时候转换成sockaddr结构就行了,毕竟都是16个字符长。

IP地址和如何处理它们

现在我们很幸运,因为我们有很多的函数来方便地操作 IP 地址。没有必要用手工计算它们,也没有必要用"<

ina.sin_addr.s_addr = inet_addr("132.241.5.10");

注意,inet_addr()返回的地址已经是网络字节格式,所以你无需再调用函数htonl()。

我们现在发现上面的代码片断不是十分完整的,因为它没有错误检查。显而易见,当inet_addr()发生错误时返回-1。记住这些二进制数字?(无符号数)-1仅仅和IP地址255.255.255.255相符合!这可是广播地址!大错特 错!记住要先进行错误检查。

好了,现在你可以将IP地址转换成长整型了。有没有其相反的方法呢?它可以将一个in_addr结构体输出成点数格式?这样的话,你就要用到函数 inet_ntoa()("ntoa"的含义是"network to ascii"),就像这样:

printf("%s",inet_ntoa(ina.sin_addr));

它将输出IP地址。需要注意的是inet_ntoa()将结构体in-addr作为一个参数,不是长整形。同样需要注意的是它返回的是一个指向一个字符的指针。它是一个由inet_ntoa()控制的静态的固定的指针,所以每次调用 inet_ntoa(),它就将覆盖上次调用时所得的IP地址。

linux sockaddr ip,sockaddr与sockaddr_in相关推荐

  1. linux sockaddr in,Linux C中sockaddr和sockaddr_in的区别

    Linux C中sockaddr和sockaddr_in的区别 struct sockaddr和struct sockaddr_in这两个结构体用来处理网络通信的地址. 在各种系统调用或者函数中,只要 ...

  2. linux 本地ip看不到,解决Linux中ifconfig和addr查看不到ip问题

    解决Linux中ifconfig和addr查看不到ip问题 1.在虚拟机上装上Linux系统,开启虚拟机,输入root,并输入密码启动 2.打开虚拟机设置,网络适配器中的网络连接选择自定义VMnet8 ...

  3. Linux TCP/IP协议栈之Socket的实现分析

    数据包的接收 作者:kendo http://www.skynet.org.cn/viewthread.php?tid=14&extra=page%3D1 Kernel:2.6.12 一.从网 ...

  4. linux socket ip层配置,Linux下Socket通信(TCP实现)

    近期在做的项目中,涉及到了进程间数据传输,系统的原本实现是通过管道,但是原有的实现中两个进程是在同一台机器,而且两个进程的关系为父子关系,而我们要做的是将其中一个进程移植到服务器上,因此两个进程要分开 ...

  5. Linux内核IP Queue机制的分析(一)

    将会通过包括本文在内的三篇文章,对IP Queue机制从用户态的应用到内核态的模块程序设计进行分析.三篇文章的题目分别是: Linux内核IP Queue机制的分析(一)--用户态接收数据包 Linu ...

  6. linux收发包内核进程名称,Linux内核IP Queue机制的分析(一)——用户态接收数据包...

    序 笔者将会通过包括本文在内的三篇文章,对IP Queue机制从用户态的应用到内核态的模块程序设计进行分析.三篇文章的题目分别是: Linux内核IP Queue机制的分析(一)­--用户态接收数据包 ...

  7. linux 协议栈之socket,Linux TCP/IP 协议栈之 Socket 的实现分析(一)

    内核版本:2.6.37 参考[作者:kendo的文章(基于内涵版本2.6.12)] 第一部份 Socket套接字的创建 socket 并不是 TCP/IP协议的一部份. 从广义上来讲,socket 是 ...

  8. Linux安装—IP设置

    2019独角兽企业重金招聘Python工程师标准>>> IP设置 务必不要把Linux的IP设置为和我们的真实机位于同一网段(这可能会跟其他机器造成冲突) 具体操作是:在安装虚拟机时 ...

  9. Linux查看ip的命令详解

    在Linux 查看ip的方法相信大家都很像了解,今天在这里就给大家介绍下Linux查看ip的急个命令,供大家参考学习,以备用时之需.下面是具体介绍. ifconfig Linux查看IP地址的命令-- ...

最新文章

  1. 你真的会解决问题吗?
  2. VB.NET 2010 如何在类Class1中调用timer事件 触发 的方法
  3. linq to sql初步
  4. 编译-编译原理C/C++ 静态链接库(.a) 与 动态链接库(.so)
  5. LeetCode Partition Equal Subset Sum(动态规划)
  6. jQuery $.ajax传递数组的traditional参数传递必须true 对象的序列化
  7. 云未来、新可能 - 绿色、无处不在、可信的计算
  8. 在Windows XP系统登录Active Directory域
  9. 在基于简单Vertx Rest的应用程序上为REST资源设置基本响应HTTP标头
  10. python元祖用法_Python序列(列表list和元组tuple)用法完全攻略
  11. C语言逗号表达式 - C语言零基础入门教程
  12. 特斯拉否认推出16万元电动车 近期全球多地曝召回
  13. IDEA离线使用本地maven仓库
  14. vivado 使用DDS IP方法
  15. MVC中的action验证登录(ActionFilterAttribute)
  16. CentOS下安装SVN
  17. 把 14 亿中国人都拉到一个微信群在技术上能实现吗?
  18. TL-WR720n 硬改 16M rom
  19. UltraCompare破解流程
  20. ToDesk版本更新,引入RTC传输技术,是否早以替代向日葵远程控制?

热门文章

  1. 网易云网页版(未完成6.6 )
  2. python爬取B站文章信息并存入数据库
  3. 海龟作图python小猪佩奇_有空学一学用Python画小猪佩奇
  4. 小米平板4上的Debian Linux(Droidian)方便日常使用的一些设置
  5. Java中Int、Integer、new Integer()之间的区别
  6. 你所不知道的按位运算
  7. 枪火游侠显示无法连接服务器,枪火游侠为什么进不去游戏|枪火游侠游戏登录不了怎么解决 - 找游戏手游网...
  8. matlab中hdr指什么,相机的HDR模式是什么?
  9. 最新导游资格证考试综合模拟题及答案
  10. 网络笔记(9) 路由协议:西出网关无故人,敢问路在何方