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. 口罩检测识别率惊人,这个Python项目开源了
  2. ASP.NET MVC + ECharts图表案例
  3. 【NLP】NLP从业人员必须知道的十大必备知识库(附资料下载)
  4. A01_[NumPy中文网]数组基础(创建数组,多维数组切片,数组属性)、使用数组(基本操作符,数组特殊运算符)、索引(花式索引,布尔索引,缺省索引)
  5. SpringToolsSuite (STS)或Eclipse安装gradle
  6. 先定个小目标, 使用C# 开发的千万级应用
  7. Vue 页面如何利用生命周期函数监听用户预览时长
  8. 客户端脚本调用服务器端动态内容,移动到链接显示预览
  9. 简单粗暴入门JAVA之方法
  10. oracle复合字段,复合索引 选择频繁的字段,还是选择选择性低的字段 放在前面?...
  11. 网站开发中很有用的几个 jQuery 地图插件
  12. win2003服务器安全设置
  13. js原生获取html的高度,js中怎么获得浏览器的高度?
  14. 【NVivo教程】使用Nvivo扩展文献综述
  15. linux vim输入法切换,完美解决Mac下Vim/Emacs的输入法切换问题
  16. Android仿微信群聊头像合成
  17. 设置非阻塞socket收发数据
  18. 2.安装node-red
  19. 《欢乐颂2》狗血的剧情才是生活该有的模样
  20. EBS 并发请求 计划 fnd_conc_release_classes

热门文章

  1. 实验4-2-3 pta验证“哥德巴赫猜想” (20分)
  2. POJ1753 棋盘翻转(位压缩+广度优先搜索)
  3. Docker入门-docker compose的使用
  4. C#中的深复制与浅复制
  5. caffe学习(1) ubunu 16.04+caffe+cuda8.0+opencv3.1安装
  6. ajax获取后台数据出错parsererror
  7. Python学习之路day03——010函数(类似Java中的方法)
  8. 数据结构(十八)树的定义与存储结构
  9. 正弦水波纹波动画 - SJWaveView
  10. python——面向对象篇之异常和反射