struct sockaddr 这个结构体是linux的网络编程接口中用来表示IP地址的标准结构体,bind、connect等函数中都需要这个结构体,这个结构体是兼容IPV4和IPV6的。

在实际编程中这个结构体会被一个struct sockaddr_in所填充。

sockaddr

用于存储参与(IP)Windows套接字通信的计算机上的一个internet协议(IP)地址。为了统一地址结构的表示方法 ,统一接口函数,使得不同的地址结构可以被bind()、connect()、recvfrom()、sendto()等函数调用。但一般的编程中并不直接对此数据结构进行操作,而使用另一个与之等价的数据结构sockaddr_in。这是由于Microsoft TCP/IP套接字开发人员的工具箱仅支持internet地址字段,而实际填充字段的每一部分则遵循sockaddr_in数据结构,两者大小都是16字节,所以二者之间可以进行切换。

sockaddr 在bind的man手册中提到

struct sockaddr
{sa_family_t sa_family;    //所选协议族AF_INETchar        sa_data[14];    //ip地址及端口号
}

说明:
sa_family :是2字节的地址家族,一般都是“AF_xxx”的形式,它的值包括三种:AF_INET,AF_INET6和AF_UNSPEC。
如果指定AF_INET,那么函数就不能返回任何IPV6相关的地址信息;如果仅指定了AF_INET6,则就不能返回任何IPV4地址信息。
AF_UNSPEC则意味着函数返回的是适用于指定主机名和服务名且适合任何协议族的地址。如果某个主机既有AAAA记录(IPV6)地址,同时又有A记录(IPV4)地址,那么AAAA记录将作为sockaddr_in6结构返回,而A记录则作为sockaddr_in结构返回
通常用的都是AF_INET。

sockaddr_in

struct sockaddr_in {short int sin_family; /* Address family */unsigned short int sin_port; /* Port number */struct in_addr sin_addr; /* Internet address */unsigned char sin_zero[8]; /* Same size as struct sockaddr */};sin_family:指代协议族,在socket编程中只能是AF_INETsin_port:存储端口号(使用网络字节顺序)sin_addr:存储IP地址,使用in_addr这个数据结构sin_zero:是为了让sockaddr与sockaddr_in两个数据结构保持大小相同而保留的空字节。
而其中in_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;

阐述下in_addr的含义,很显然它是一个存储ip地址的共用体有三种表达方式:
第一种用四个字节来表示IP地址的四个数字;
第二种用两个双字节来表示IP地址;
第三种用一个长整型来表示IP地址。
给in_addr赋值的一种最简单方法是使用inet_addr函数,它可以把一个代表IP地址的字符串赋值转换为in_addr类型,如addrto.sin_addr.s_addr=inet_addr("192.168.0.2");
其反函数是inet_ntoa,可以把一个in_addr类型转换为一个字符串。

虽然是两个结构体可是二者的占用的内存是一致的,因此可以互相转化。

sockaddr常用于bind、connect、recvfrom、sendto等函数的参数,指明地址信息。是一种通用的套接字地址。

而sockaddr_in 一般是储存地址和端口的。用于信息的显示及存储使用

例如:

struct sockaddr_in addr_server;addr_server.sin_family = AF_INET;
addr_server.sin_port = htons(RPORT);
addr_server.sin_addr.s_addr = inet_addr(RHOST);

然而,在类似于bind accept的函数中

ret = bind(fd_sock, (struct sockaddr *)&addr_server, sizeof(addr_server));
if(ret < 0)
{perror("bind");return -1;
}

之前只是这样的记下来了,可是知道一天,想显示所连接的客户端的ip地址的时候,就发现了问题所在

char *inet_ntoa(struct in_addr in);

函数原型是这样的,可是在

struct in_addr
{in_addr_t s_addr;
};

这个in_addr是sockaddr_in的一个mamber

fd_connection = accept(fd_sock,  (struct sockaddr *)&addr_client, &addr_client_len);if(fd_connection < 0){perror("accept");return -1;}printf("connected! : %d\n", fd_connection);printf("%s%s\n", "the client ip is :", inet_ntoa(addr_client.sin_addr));

  

转载于:https://www.cnblogs.com/wuyepeng/p/9721546.html

网络编程——sockaddr 与 sockaddr_in相关推荐

  1. 网络编程--sockaddr 与 sockaddr_in

    From: http://www.it165.NET/pro/html/201211/4066.html 在初学的时候对二者甚是迷茫一会就晕了 在这里总结一句话: struct sockaddr 这个 ...

  2. linux下C语言套接字编程sockaddr和sockaddr_in的区别

    tcp建立后,我想linux的服务端可以为每个连接的ip地址分配编号,方便进行每个客户端进行数据交互.所以我要知道每个连接的ip地址. struct sockaddr和struct sockaddr_ ...

  3. C语言网络编程函数与相关结构汇总

    持续更新中- 服务器和客户端的一般流程 服务器端:socket()-->bind( )-->listen()-->accept()-->read()/write()---> ...

  4. 【Socket网络编程】2.sockaddr 和 sockaddr_in

    sockaddr 和 sockaddr_in 参考 https://blog.csdn.net/ZWE7616175/article/details/80252048 sockaddr在/usr/in ...

  5. linux sockaddr结构体,linux网络编程笔记 sockaddr_in结构体[转]

    struct sockaddr { unsigned short sa_family; char sa_data[14]; }; 此数据结构用做bind.connect.recvfrom.sendto ...

  6. 【C++】Winsock套接字编程,struct sockaddr、sockaddr_in,主机网络字节序

    前一篇关于windows平台下winsock套接字编程的相关api struct sockaddr与struct sockaddr_in 在bind函数,connect函数里提到了套接字编程网络地址信 ...

  7. 【网络编程】Sockaddr与Sockaddr_in

    在demo中,bind() 第二个参数的类型为 sockaddr,而代码中却使用 sockaddr_in,然后再强制转换为 sockaddr,这是为什么呢? 两者结构体对比 括号内为所占用的字节数: ...

  8. 【Linux网络编程学习】预备知识(网络字节序、IP地址转换函数、sockaddr数据结构)

    此为牛客Linux C++课程和黑马Linux系统编程笔记. 1. 网络字节序 我们已经知道,内存中的多字节数据相对于内存地址有大端和小端之分. 磁盘文件中的多字节数据相对于文件中的偏移地址也有大端小 ...

  9. Linux套接字编程之sockaddr与sockaddr_in网络套接字,sockaddr_un进程间通信本地套接字

    sockaddr struct sockaddr { unsigned  short  sa_family;     /* address family, AF_xxx */ char  sa_dat ...

最新文章

  1. 【Linux学习九】负载均衡
  2. STM32 ADC 同步规则模式 ADC1与ADC2同用一个DMA
  3. Ubuntu 16.04调节屏幕显示字体大小
  4. N个Java开发常用规范技巧总结
  5. 很好的Android论坛
  6. [css] 如何使用css实现跨浏览器的最小高度?
  7. SQL语句:建表语句、插入语句、查询语句、增加列、删除列、查询语句like、修改语句
  8. matlab计算16 1 3近似值,8. 科学计算软件Matlab中默认情况下π为近似值3.1416,该近似值与π真值的( )...
  9. 八个方便C#开发的省时的国外工具
  10. python 中m op n运算_Python数字类型、数值运算操作符、数值运算函数
  11. kotlin 循环_Kotlin控制流–否则,用于循环,同时,范围
  12. android classloader双亲托付模式
  13. HDU 2196 Computer 树形DP
  14. 真正解决办法:编译freeswitch错误,You must install libavformat-dev to build mod_av
  15. P-6002-10PK,P-6002-2PK脂质研究工具解析
  16. kubeadm部署单Master节点kubernetes集群 1.21.0
  17. html5 ios 键盘挡住输入框,IOS 键盘挡住输入框的问题解决办法
  18. DocSearcher:文档搜索引擎
  19. JavaScript-修炼之路第五层
  20. 学无止境,学无止境啊

热门文章

  1. SAP Netweaver和Hybris的数据库层
  2. 画世界上传图片提交到服务器_【MUI】选择图片并上传至服务器
  3. 初中计算机基础知识教程考试,2017年职称计算机考试基础知识教程详解(三十一)...
  4. thinkphp 助手函数url不生成https_thinkphp5.0 URL 地址生成
  5. python多级网址爬取_python-29:多级页面爬取源码
  6. 开启进度比的文本为什么没有显示_没有开通智钻,为什么会显示流量是在智钻进店的呢?...
  7. linux 怎么重装libaprutil,Apache安装出错_cannot install `libaprutil-1.la' to a directory
  8. c语言实现快速排序对文件中字符,C语言中快速排序和插入排序优化的实现
  9. palindromic java_Longest Palindromic Substring leetcode java
  10. pip keras 失败_关于 Python 机器学习导包失败 简短的补充