目录

一、先看两个结构体的定义

1.1 sockaddr

1.2 sockaddr_in

二、sockaddr与sockaddr_in的相同点和区别

2.1 相同点

2.2 区别

三、使用方法

3.1 socket编程中sockaddr和sockaddr_in的强制转换

3.2 补充部分


struct sockaddr和struct sockaddr_in这两个结构体用来处理网络通信的地址。
在各种系统调用或者函数中,只要和网络地址打交道,就得用到这两个结构体。
网络中的地址包含3个方面的属性:
1.地址类型: ipv4还是ipv6
2.ip地址
3.端口

一、先看两个结构体的定义

1.1 sockaddr

sockaddr在头文件#include <sys/socket.h>中定义,sockaddr的缺陷是:sa_data把目标地址和端口信息混在一起了,如下

struct sockaddr {  sa_family_t sin_family;//地址族char sa_data[14]; //14字节,包含套接字中的目标地址和端口信息               }; 

1.2 sockaddr_in

sockaddr_in在头文件#include<netinet/in.h>#include <arpa/inet.h>中定义,该结构体解决了sockaddr的缺陷,把port和addr 分开储存在两个变量中,如下:

struct sockaddr_in {short            sin_family;       // 2 bytes e.g. AF_INET, AF_INET6unsigned short   sin_port;    //16位 2 bytes e.g. htons(3490)struct in_addr   sin_addr;     //32位 4 bytes see struct in_addr, belowchar             sin_zero[8];     // 8 bytes zero this if you want to
};
//另一个结构体 in_addr存放32位ip地址
struct in_addr {unsigned long s_addr;          // 4 bytes load with inet_pton()
};

二、sockaddr与sockaddr_in的相同点和区别

2.1 相同点

两个结构体的大小都是16个字节,而且都有family属性;

2.2 区别

数据形式上的区别:

sockaddr用14个字节来表示sa_data,而sockaddr_in把14个字节拆分成sin_port, sin_addr和sin_zero分别表示端口、ip地址。sin_zero用来填充字节使sockaddr_in和sockaddr保持一样大小。
sockaddr和sockaddr_in包含的数据都是一样的。

使用上的区别:

程序员不应操作sockaddr,sockaddr是给操作系统用的
程序员应使用sockaddr_in来表示地址,sockaddr_in区分了地址和端口,使用更方便。

也就是,程序员把类型、ip地址、端口填充sockaddr_in结构体,然后强制转换成sockaddr,作为参数传递给系统调用函数。

三、使用方法

3.1 socket编程中sockaddr和sockaddr_in的强制转换

先看看网络编程经典用法。

#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>#define SERV_IP "192.168.1.0"   //服务器ipint main(int argc,char **argv)
{int sockfd;struct sockaddr_in mysock;//定义sockaddr_in结构体mysocksockfd = socket(AF_INET,SOCK_STREAM,0);  //定义套接字 获得sockfd/******填充sockaddr_in******/bzero(&mysock,sizeof(mysock));  //初始化结构体mysock.sin_family = AF_INET;  //设置地址家族mysock.sin_port = htons(800);  //设置端口mysock.sin_addr.s_addr = inet_addr("192.168.1.0");  //设置ip地址//mysock.sin_addr.s_addr = inet_addr(SERV_IP); //将字符串形式的ip地址转换为点分十进制格式的ip地址/******绑定端口的时候进行强制转换******/bind(sockfd,(struct sockaddr *)&mysock,sizeof(struct sockaddr); //bind的时候进行转换 ... .../******连接的时候进行强制转换********/connect(sockfd, (struct sockaddr *) &mysock, sizeof(mysock));... ...return 0;
}

3.2 补充部分

两个函数 htons()、 inet_addr()和inet_ntoa()。

htons()作用是将端口号由主机字节序转换为网络字节序的整数值。(host to net)

inet_addr()作用是将一个IP字符串转化为一个网络字节序的整数值,用于sockaddr_in.sin_addr.s_addr。

inet_ntoa()作用是将一个sin_addr结构体输出成IP字符串(network to ascii)。比如:

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

htonl()作用和htons()一样,不过它针对的是32位的(long),而htons()针对的是两个字节,16位的(short)。

与htonl()和htons()作用相反的两个函数是:ntohl()和ntohs()。

TCP/UDP中sockaddr和sockaddr_in的区别及用法相关推荐

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

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

  2. socket编程之sockaddr和sockaddr_in的区别

    sockaddr和sockaddr_in的区别 sockaddr和sockaddr_in详解 1.struct sockaddr和struct sockaddr_in这两个结构体用来处理网络通信的地址 ...

  3. 浅析TCP协议中URG和PSH的区别与联系

    浅析TCP协议中URG和PSH的区别与联系.URG:(紧急标志位)表示本报文段中发送的数据是否包含紧急数据.URG=1时,表示有紧急数据.后面的16位紧急指针字段只有在URG=1时才有效. URG:( ...

  4. js中几个对象的区别和用法

    js中几个对象的区别和用法 今天总结一下js中几个对象的区别和用法: 首先来说说 parent.window与top.window的用法 "window.location.href" ...

  5. java caller_JavaScript中callee和caller的区别与用法实例分析

    本文实例讲述了JavaScript中callee和caller的区别与用法.分享给大家供大家参考,具体如下: 1.callee 在函数的内部,有两个特殊的对象:arguments和this.其中arg ...

  6. js中parentNode和parentElement的区别和用法

    了解本篇的基础必须知道什么是节点,关于html dom节点知识点和节点类型的知识,分别看<js节点都有哪些类型?怎么判断是哪种节点类型?>和<js属性节点获取和移除>,下面直接 ...

  7. javascript中call和apply的区别和用法

    javascript中call和apply的区别和用法 1.call和apply是什么 更改对象的内部指针指向,即改变对象的this指向的内容 function Fn(){this.name='小明' ...

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

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

  9. sockaddr与sockaddr_in的区别

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

最新文章

  1. 我的世界服务器ess配置信息,[搬运贴]超详细的Ess基础插件介绍
  2. QIIME 2教程. 31名词Glossary(2021.2)
  3. C语言之头文件,static与const关键字
  4. datatables 无法 无法重新初始化datatable_伽巫塔罗:2020年9月运势占卜,摩羯没了热情,无法重新卡死...
  5. Codeforce 水题报告(2)
  6. JMS ActiveMQ案例
  7. Linux下的IO监控与分析
  8. OpenCV3.4.1 vs2015 自定义过程的图片拼接
  9. 我的世界服务器光影文件夹,我的世界光影怎么开?中国版介绍
  10. SSRS 2012 高级图表类型 -- 圆饼图
  11. “2019年全国职业院校技能大赛”高职组计算机网络应用竞赛竞赛样题C卷(软件定义网络部分答案参考)
  12. vs2019,C#,MySQL创建图书管理系统3(管理员相关页面的布局和设计实现,图书显示,图书添加)
  13. android虚拟机运行app出现错误Unfortunately
  14. C语言BT软件项目总结
  15. Oracle system identifier already exists specify another SID
  16. vs2013怎么清理解决方案_vs2010/2013项目所在文件夹越来越大如何解决?
  17. 程序员面试简历注意事项
  18. 软件测试二分查找函数,二分查找
  19. Esxi5.5添加4T报错的问题
  20. 路由器 设置 端口映射

热门文章

  1. python图层合并_GIS实验之文件夹中的批量图层合并Python实现
  2. C++ cout输出小数位数
  3. 计算机系统中设置保护系统还原,如何在Windows 7中使用系统还原
  4. 笔记本独显怎么用配置cuda环境
  5. 切换PS工具栏里的快捷键
  6. UP主排名丨飞瓜数据B站平台充电周榜排行榜2022年1月17日-1月23日
  7. 游戏建模:3DMax和Maya到底哪个更好用?
  8. TreeMap排序探寻
  9. 【Java】输入一个数组
  10. Zuul网关之限流实现