sockaddr和sockaddr_in详解
struct sockaddr和struct sockaddr_in这两个结构体用来处理网络通信的地址。
一、sockaddr
sockaddr在头文件#include <sys/socket.h>
中定义,sockaddr的缺陷是:sa_data把目标地址和端口信息混在一起了,如下:
struct sockaddr { sa_family_t sin_family;//地址族char sa_data[14]; //14字节,包含套接字中的目标地址和端口信息 };
二、sockaddr_in
sockaddr_in在头文件#include<netinet/in.h>或#include <arpa/inet.h>
中定义,该结构体解决了sockaddr的缺陷,把port和addr 分开储存在两个变量中,如下:
sin_port和sin_addr都必须是网络字节序(NBO),一般可视化的数字都是主机字节序(HBO)。
三、总结
二者长度一样,都是16个字节,即占用的内存大小是一致的,因此可以互相转化。二者是并列结构,指向sockaddr_in结构的指针也可以指向sockaddr。
sockaddr常用于bind、connect、recvfrom、sendto等函数的参数,指明地址信息,是一种通用的套接字地址。
sockaddr_in 是internet环境下套接字的地址形式。所以在网络编程中我们会对sockaddr_in结构体进行操作,使用sockaddr_in来建立所需的信息,最后使用类型转化就可以了。一般先把sockaddr_in变量赋值后,强制类型转换后传入用sockaddr做参数的函数:sockaddr_in用于socket定义和赋值;sockaddr用于函数参数。
例子如下:
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>int main(int argc,char **argv)
{int sockfd;struct sockaddr_in mysock;sockfd = socket(AF_INET,SOCK_STREAM,0); //获得fdbzero(&mysock,sizeof(mysock)); //初始化结构体mysock.sin_family = AF_INET; //设置地址家族mysock.sin_port = htons(800); //设置端口mysock.sin_addr.s_addr = inet_addr("192.168.1.0"); //设置地址bind(sockfd,(struct sockaddr *)&mysock,sizeof(struct sockaddr); /* bind的时候进行转化 */... ...return 0;
}
题外话,两个函数 htons() 和 inet_addr()。
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/IP网络编程》
http://www.it165.net/pro/html/201211/4066.html
http://www.cnblogs.com/huqian23456/archive/2011/02/22/1961822.html
sockaddr和sockaddr_in详解相关推荐
- sockaddr和 sockaddr_in详解
[转]socket编程--sockaddr_in结构体操作 sockaddr结构体 sockaddr的缺陷:sa_data把目标地址和端口信息混在一起了 struct sockaddr { ...
- socket编程之sockaddr和sockaddr_in的区别
sockaddr和sockaddr_in的区别 sockaddr和sockaddr_in详解 1.struct sockaddr和struct sockaddr_in这两个结构体用来处理网络通信的地址 ...
- sockaddr与sockaddr_in,sockaddr_un结构体详解
struct sockaddr { unsigned short sa_family; /* address family, AF_xxx */ char sa_data[14]; ...
- sockaddr详解
struct sockaddr { unsigned short sa_family; /* address family, AF_xxx */ char sa_data[14 ...
- C语言网络编程:accept函数详解
文章目录 前言 函数描述 代码实例 如何得到客户端的IP 和 端口号 前言 当使用tcp服务器使用socket创建通信文件描述符,bind绑定了文件描述符,服务器ip和端口号,listen将服务器端的 ...
- 【网络编程】非阻塞connect详解
一.为什么使用非阻塞connect TCP连接的建立涉及一个在三路握手过程,阻塞的connect一直等到客户收到自己的SYN的ACK才返回,这需要至少一个RTT时间,RTT时间波动很大从几毫秒到几秒. ...
- webSocket详解
前言 本文会用实例的方式,将iOS各种IM的方案都简单的实现一遍.并且提供一些选型.实现细节以及优化的建议. 注:文中的所有的代码示例,在github中都有demo: iOS即时通讯,从入门到&quo ...
- linux epoll事件模型详解
一.介绍 epoll是Linux(内核版本2.6及以上支持)下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率,因为它会复用文件 ...
- Socket详解——全面明了
"一切皆Socket!"原文链接 话虽些许夸张,但是事实也是,现在的网络编程几乎都是用的socket. --有感于实际编程和开源项目研究. 我们深谙信息交流的价值,那网络中进程之间 ...
最新文章
- Windows 10系统中如何显示文件后缀名
- 如何自学Python?这本技术大咖推荐Python书籍,就是你的第一选择
- IDEA 热启动,每次更改代码后不用重启服务
- python怎么读文件内容-Python 文件内容读取
- 使用Github搜索开源项目
- python网络编程视频教程_Java网络开发视频教程 – 一站式学习Java网络编程视频教程 全面理解BIO(无密)...
- 【linux】学习笔记
- Cypress 等待某个 HTTP put 请求得到 200 状态码后,再执行下一步的操作代码
- Redis的常用功能
- SQL Server中使用的公共数据类型
- 高速通道 > 专有网络对等连接(关闭新购) > VPC互连
- Android开发笔记(七十七)图片缓存算法
- python web环境傻瓜搭建_Python 环境搭建以及神器推荐,果断收藏!
- 半天的成果,已经很快了,还有方案实现过程
- matlab利用图像减法实现找茬
- 还没有合并再请求pull_代码被revert,你pull了master代码没了咋找回来
- 进入大数据时代,目前我国大数据的发展趋势怎么样
- 不错的json在线编辑器
- 在用户输入手机号或者要求输入纯数字时,输入法自动切换到数字的代码
- python导入excel数据到mysql
热门文章
- 苹果6手机怎么录屏_苹果手机如何开启录屏功能 苹果手机开启录屏功能方法【详解】...
- 解决Arcmap中遥感影像颜色显示异常问题
- 9269:Big String超级字符串
- Python中嵌套循环练习
- 口子窖Q3营收净利双增背后:高档酒占比下降拖累毛利率下滑
- 赢在微点答案专区英语_英语的搭讪万能句,还不来学一下? l 从零开始学英语 E0220...
- 工地智能安全帽方案/设计案列/APP
- ftp 客户端,9款超级好用而且免费的ftp 客户端,你值得拥有
- Qt4实现TableView显示表格数据
- CF(C. Scoring Subsequences)(div2)