sockaddr和sockaddr_in的区别

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

初学者很容易对二者有困惑的感觉,下面来讲一下二者的区别。

sockaddr是在头文件 /usr/include/bits/socket.h 中定义的,如下:

 

view sourceprint?
1.struct sockaddr
2.{
3.__SOCKADDR_COMMON (sa_);    /* Common data: address family and length.  协议族*/
4.char sa_data[14];       /* Address data.  地址+端口号*/
5.};


 

而sockaddr_in是在头文件 /usr/include/netinet/in.h 中定义的,如下:

 

view sourceprint?
01./* Structure describing an Internet socket address.  */
02.struct sockaddr_in
03.{
04.__SOCKADDR_COMMON (sin_);           /* 协议族 */
05.in_port_t sin_port;         /* Port number. 端口号 */
06.struct in_addr sin_addr;        /* Internet address. IP地址 */
07. 
08./* Pad to size of `struct sockaddr'.  用于填充的0字节 */
09.unsigned char sin_zero[sizeof (struct sockaddr) -
10.__SOCKADDR_COMMON_SIZE -
11.sizeof (in_port_t) -
12.sizeof (struct in_addr)];
13.};
14. 
15./* Internet address. */
16.typedef uint32_t in_addr_t;
17.struct in_addr
18.{
19.in_addr_t s_addr;
20.};


 

二者的占用的内存大小是一致的,因此可以互相转化,从这个意义上说,他们并无区别。

sockaddr常用于bind、connect、recvfrom、sendto等函数的参数,指明地址信息。是一种通用的套接字地址。而sockaddr_in 是internet环境下套接字的地址形式。所以在网络编程中我们会对sockaddr_in结构体进行操作。使用sockaddr_in来建立所需的信息,最后使用类型转化就可以了。下面是一个完整的例子。

 

view sourceprint?
01.#include <stdio.h>
02.#include <stdlib.h>
03.#include <sys/socket.h>
04.#include <netinet/in.h>
05. 
06.int main(int argc,char **argv)
07.{
08.int sockfd;
09.struct sockaddr_in mysock;
10. 
11.sockfd = socket(AF_INET,SOCK_STREAM,0);  //获得fd
12. 
13.bzero(&mysock,sizeof(mysock));  //初始化结构体
14.mysock.sin_family = AF_INET;  //设置地址家族
15.mysock.sin_port = htons(800);  //设置端口
16.mysock.sin_addr.s_addr = inet_addr("192.168.1.0");  //设置地址
17.bind(sockfd,(struct sockaddr *)&mysock,sizeof(struct sockaddr); /* bind的时候进行转化 */
18.... ...
19.return 0;
20.}


 

题外话,两个函数 htons() 和 inet_addr()。

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

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

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

 

view sourceprint?
1.printf("%s",inet_ntoa(mysock.sin_addr));


 

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

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


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/405421.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[react] 什么时候使用状态管理器?

[react] 什么时候使用状态管理器&#xff1f; 1用户的使用方式复杂 2.不同身份的用户有不同的使用方式&#xff08;比如普通用户和管理员&#xff09; 3.多个用户之间可以协作 4.与服务器大量交互&#xff0c;或者使用了WebSocket 5.View要从多个来源获取数据 从组件角度看 1.…

FlexViewer2.3中拉帘Widget下载

http://www.giser.net/?p280 由于最新的ArcGIS API for flex2.x使用了Flex SDK4&#xff0c;因此造成了对之前ArcGIS API for flex1.x制 作的拉帘Widget无法使用&#xff0c;因此重新制作了拉帘工具供大家使用。 下载地址&#xff1a; Swipe 使用方法&#xff1a;将下载后的sw…

scanf sscanf 的用法

一、scanf函数 scanf() - 以屏幕(stdin)为输入源&#xff0c;提取输入指定格式的数据&#xff0c;返回提取的数据个数。 函数原型:int scanf( const char *format [,argument]... ); 二、sscanf函数 sscanf() - 从一个字符串中读进与指定格式相符的数据&#xff0c;非常适合…

spring ioc原理

IOC&#xff08;DI&#xff09;&#xff1a;java程序员都知道&#xff1a;java程序中的每个业务逻辑 至少需要两个或以上的对象来协作完成&#xff0c;通常&#xff0c;每个对象在使用他的合作对象时&#xff0c;自己均要使用像new object&#xff08;&#xff09; 这样的语法来…

五种I/O 模式——阻塞(默认IO模式),非阻塞(常用语管道),I/O多路复用(IO多路复用的应用场景),信号I/O,异步I/O

From: http://blog.163.com/xychenbaihuyeah/blog/static/13222965520112163171778/ 五种I/O 模式&#xff1a; 【1】 阻塞 I/O (Linux下的I/O操作默认是阻塞I/O&#xff0c;即open和socket创建的I/O都是阻塞I/O) 【2】 非阻塞 I/O (可以通过f…

【hive】Hive中的大宽表及其底层详细技术点

简介: 在大数据环境中&#xff0c;处理大规模数据集是常见的需求。为了满足这种需求&#xff0c;Hive引入了大宽表&#xff08;Large Wide Table&#xff09;的概念&#xff0c;它是一种在Hive中管理和处理大量列的数据表格。本文将详细介绍Hive中的大宽表概念以及其底层的详细…

[react] render函数中return如果没有使用()会有什么问题?

[react] render函数中return如果没有使用()会有什么问题&#xff1f; 我们在使用JSX语法书写react代码时&#xff0c;babel会将JSX语法编译成js&#xff0c;同时会在每行自动添加分号&#xff08;&#xff1b;&#xff09;&#xff0c;如果return后换行了&#xff0c;那么就会…

小程序tabbar文字在服务器上不显示,小程序的tabbar不显示

1. tabbar 不显示刚开始给页面加tabbar时{"pages":["pages/index/index","pages/all/all","pages/relax/relax","pages/me/me","pages/wen/wen","pages/logs/logs"],"window":{"backgro…

Linux fprintf的用法

一、fprintf 函数描述 fprintf其作用是格式化打印&#xff0c;也叫格式化输出&#xff0c;可以指定输出到一个流文件中&#xff0c;即相输出流中写入数据。fprintf()函数根据指定的格式(format)&#xff0c;向输出流(stream)写入数据(argument)。fprintf( )会根据参数format 字…

2015 7 18

ExecuteNonQuery返回的是受影响的行数ExecuteScalar返回的是第一行第一列的值 制作密码找回的冻结功能 一个变量 当点击提交密码问题答案时1 达到3次时 数据库中的时间项纪录为当前时间 返回首页 执行找回密码操作时 点击下一步 先进行判定 如果用户名存在 其当前日期-冻…

windows组件向导里没有internet 信息服务(iis) 的解决办法

From: http://blog.163.com/red419126/blog/static/18862284200882155215627/ 电脑要重装系统&#xff0c;借同事的xp光盘&#xff0c;一切顺利。却发现这个新系统添加删除组件向导里没有iis了。怎么办呢&#xff1f; 在运行中输入"c:\windows\inf\sysoc.inf"&…

Linux tm time_t timeval timespec以及与时间相关函数用法

一、时间类型 linux中编程通常需要用到时间变量&#xff0c;和相关的时间操作函数。常用的时间类型有&#xff1a; time_t 、struct timeval、struct timespec、struct tm。 在用到相关的类型和函数时&#xff0c;需要加上头文件&#xff1a;#include <time.h> …

Apache的prefork模式和worker模式

prefork模式 这个多路处理模块(MPM)实现了一个非线程型的、预派生的web服务器&#xff0c;它的工作方式类似于Apache 1.3。它适合于没有线程安全库&#xff0c;需要避免线程兼容性问题的系统。它是要求将每个请求相互独立的情况下最好的MPM&#xff0c;这样若一个请求出现问题就…

[react] 说说Context有哪些属性?

[react] 说说Context有哪些属性&#xff1f; context属于一种解决组件间层级过多传递数据的问题&#xff0c;避免了层层嵌套的通过props传递的形式&#xff0c;同时对于不需要使用到redux时&#xff0c;是一种解决方案&#xff0c;关于组件的复用性变差的问题&#xff0c;我觉…

艾泰路由器设置虚拟服务器,艾泰路由器设置步骤

艾泰路由器设置步骤艾泰科技路由器默认配置完之后就可以上网&#xff0c;内网私网地址通过WAN口的"NAT转换来上网。但某些特殊时候却不需要NAT模式&#xff0c;用户需要纯路由模式来转发&#xff0c;下面是小编整理的相关内容&#xff0c;欢迎阅读参考&#xff01;ReOS V2…

ubuntu 安装(install) pwntcha[一个做验证码识别的开源程序]

一、安装 1. sudo apt-get install libsdl1.2-dev libsdl1.2debian sudo apt-get install libsdl1.2-dev(比较大&#xff0c;10M左右) sudo apt-get install libsdl-image1.2-dev sudo apt-get install libsdl-mixer1.2-dev sudo apt-get install libsdl-ttf2.0-dev sudo apt-g…

IIS出现The specified module could not be found解决方法

From: http://www.cnblogs.com/hanxianlong/archive/2008/10/25/1319269.html 打开IIS 信息服务&#xff0c;在左侧找到自己的计算机&#xff0c;点右键&#xff0c;选择属性&#xff0c;在主属性中选编辑&#xff0c;打开“目录安全性”选项卡&#xff0c;单击“匿名访问和验…

嵌入式开发中模拟SPI的驱动

这里贴一下自己的模拟SPI驱动&#xff0c;移植的话需要实现SPI管脚的定义和初始化。 一、管脚初始化 MOSI_PIN&#xff1a;设置MOSI为输出模式SCK_PIN&#xff1a;设置SCK为输出模式CSN_PIN&#xff1a;设置CSN为输出模式MISO_PIN&#xff1a;设置MISO为输入模式MOSI_PIN_HIG…

开始整理资料

现在想想为什么这么晚才在CSDN安家&#xff0c;如果大一的时候就开始写博客了&#xff0c;记录生活的点点滴滴&#xff0c;那该有多好。 回去以前做过的许多事情&#xff0c;总是一知半解&#xff0c;如果当时能够想到写博客&#xff0c;那么理解程度就不是现在这个样子了。 知…

[react] 你有使用过React Intl吗?

[react] 你有使用过React Intl吗&#xff1f; 一种react国际化的解决方案 个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题 个人简介 我是歌谣&#xff0c;欢迎和…