TCP/UDP中sockaddr和sockaddr_in的区别及用法
目录
一、先看两个结构体的定义
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的区别及用法相关推荐
- linux sockaddr in,Linux C中sockaddr和sockaddr_in的区别
Linux C中sockaddr和sockaddr_in的区别 struct sockaddr和struct sockaddr_in这两个结构体用来处理网络通信的地址. 在各种系统调用或者函数中,只要 ...
- socket编程之sockaddr和sockaddr_in的区别
sockaddr和sockaddr_in的区别 sockaddr和sockaddr_in详解 1.struct sockaddr和struct sockaddr_in这两个结构体用来处理网络通信的地址 ...
- 浅析TCP协议中URG和PSH的区别与联系
浅析TCP协议中URG和PSH的区别与联系.URG:(紧急标志位)表示本报文段中发送的数据是否包含紧急数据.URG=1时,表示有紧急数据.后面的16位紧急指针字段只有在URG=1时才有效. URG:( ...
- js中几个对象的区别和用法
js中几个对象的区别和用法 今天总结一下js中几个对象的区别和用法: 首先来说说 parent.window与top.window的用法 "window.location.href" ...
- java caller_JavaScript中callee和caller的区别与用法实例分析
本文实例讲述了JavaScript中callee和caller的区别与用法.分享给大家供大家参考,具体如下: 1.callee 在函数的内部,有两个特殊的对象:arguments和this.其中arg ...
- js中parentNode和parentElement的区别和用法
了解本篇的基础必须知道什么是节点,关于html dom节点知识点和节点类型的知识,分别看<js节点都有哪些类型?怎么判断是哪种节点类型?>和<js属性节点获取和移除>,下面直接 ...
- javascript中call和apply的区别和用法
javascript中call和apply的区别和用法 1.call和apply是什么 更改对象的内部指针指向,即改变对象的this指向的内容 function Fn(){this.name='小明' ...
- linux下C语言套接字编程sockaddr和sockaddr_in的区别
tcp建立后,我想linux的服务端可以为每个连接的ip地址分配编号,方便进行每个客户端进行数据交互.所以我要知道每个连接的ip地址. struct sockaddr和struct sockaddr_ ...
- sockaddr与sockaddr_in的区别
struct sockaddr {unsigned short sa_family; char sa_data[14]; }; 此数据结构用做bind.connect.recvfrom.sendto等 ...
最新文章
- 我的世界服务器ess配置信息,[搬运贴]超详细的Ess基础插件介绍
- QIIME 2教程. 31名词Glossary(2021.2)
- C语言之头文件,static与const关键字
- datatables 无法 无法重新初始化datatable_伽巫塔罗:2020年9月运势占卜,摩羯没了热情,无法重新卡死...
- Codeforce 水题报告(2)
- JMS ActiveMQ案例
- Linux下的IO监控与分析
- OpenCV3.4.1 vs2015 自定义过程的图片拼接
- 我的世界服务器光影文件夹,我的世界光影怎么开?中国版介绍
- SSRS 2012 高级图表类型 -- 圆饼图
- “2019年全国职业院校技能大赛”高职组计算机网络应用竞赛竞赛样题C卷(软件定义网络部分答案参考)
- vs2019,C#,MySQL创建图书管理系统3(管理员相关页面的布局和设计实现,图书显示,图书添加)
- android虚拟机运行app出现错误Unfortunately
- C语言BT软件项目总结
- Oracle system identifier already exists specify another SID
- vs2013怎么清理解决方案_vs2010/2013项目所在文件夹越来越大如何解决?
- 程序员面试简历注意事项
- 软件测试二分查找函数,二分查找
- Esxi5.5添加4T报错的问题
- 路由器 设置 端口映射