From: http://www.it165.NET/pro/html/201211/4066.html

在初学的时候对二者甚是迷茫一会就晕了
在这里总结一句话:

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

sockaddr 在bind的man手册中提到

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

而sockaddr_in

  {__SOCKADDR_COMMON (sin_);in_port_t sin_port;             /* Port number.  */struct in_addr sin_addr;        /* Internet address.  */unsigned char sin_zero[sizeof (struct sockaddr) -__SOCKADDR_COMMON_SIZE -sizeof (in_port_t) -sizeof (struct 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));

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

  1. 网络编程——sockaddr 与 sockaddr_in

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

  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. 东北黑木耳 微信公共帐号 销售 批发 分享 交流 东北鸿顺山特产品有限公司
  2. WinCvs提示:import requires write access to the repository
  3. 006_P名称空间的属性注入
  4. Django中的Session与Cookie
  5. Debian耳机声音问题
  6. locate: database too small: /var/db/locate.databas
  7. 《论文笔记》Multi-UAV Collaborative Monocular SLAM
  8. 将表达式树转换成中缀表达式☆
  9. 设计灵感|各种孟菲斯风格海报,让你眼花缭乱
  10. 配置网络策略中的 NAP 条件
  11. php调试代码时var_dump( )打印中文字符时出现乱码解决方案
  12. 13.程序员的自我修养---运行库实现
  13. JVM、JRE、JDK、java ee sdk with jdk四者的区别
  14. POJ 1273 EK算法
  15. 如何阻止华为杀应用_如何解决华为手机“杀后台”严重的情况呢?小技巧就能轻松搞定...
  16. 基于 arduino 的两轮自行车
  17. 2010年6月 工作 计划 发奋图钱 再接再厉
  18. c#子线程调用主线程控件
  19. Crane: 腾讯开源一款基于 FinOps 超强大云资源分析与成本优化平台
  20. 金山毒霸6 、金山网镖6 增强版 发布在即!!!

热门文章

  1. Java黑皮书课后题第11章:11.3(Account类的子类)在编程练习题9.7中定义了一个Account类来对一个银行账户建模。一个账户有账号、余额、年利率、开户日期等属性,以及存款和取款等方法
  2. Java黑皮书课后题第11章:11.2(Person Student Employee Faculty Staff类)设计一个名为Person的类及其两个名为Student和Employee的子类
  3. 2016年大学计算机期末试题及答案,2016年大学计算机基础试题题库及答案
  4. linux下什么文件不能修改,Linux和Unix下root也不能修改文件与目录的命令
  5. ASP.NET MVC 简单的分页思想与实现
  6. 如何扩展 Azure 资源组中虚拟机的 OS 驱动器
  7. js mysql 时间日期比较
  8. Android 查看设备文件
  9. 第六十节,文本元素标签
  10. SQL Server 索引结构及其使用(一)[转]