Linux网络编程之sockaddr与sockaddr_in,sockaddr_un分析
sockaddr
struct sockaddr {
unsigned short sa_family; /* address family, AF_xxx */
char sa_data[14]; /* 14 bytes of protocol address */
};
sa_family是地址家族,一般都是“AF_xxx”的形式。通常大多用的是都是AF_INET。
sa_data是14字节协议地址。
此数据结构用做bind、connect、recvfrom、sendto等函数的参数,指明地址信息。
但一般编程中并不直接针对此数据结构操作,而是使用另一个与sockaddr等价的数据结构
在网络编程经常可以看到如此示例:
struct sockaddr_in server_sockaddr;
bind (server_sockfd, (struct sockaddr *)&server_sockaddr, server_len);struct sockaddr_un server_sockaddr;
bind (server_sockfd, (struct sockaddr *)&server_sockaddr, server_len);
在第二个参数我们通常会将其强制转化为通用的sockaddr。以下说明
sockaddr_in
sockaddr_in(在netinet/in.h中定义):
struct sockaddr_in {
short int sin_family; /* Address family */
unsigned short int sin_port; /* Port number */
struct in_addr sin_addr; /* Internet address */
unsigned char sin_zero[8]; /* Same size as struct sockaddr */
};
struct in_addr {
unsigned long s_addr;
};typedef struct in_addr {
union {struct{unsigned char s_b1,s_b2,s_b3,s_b4;} S_un_b;struct {unsigned short s_w1,s_w2;} S_un_w;unsigned long S_addr;} S_un;
} IN_ADDR;
sin_family指代协议族,在socket编程中只能是AF_INET
sin_port存储端口号(使用网络字节顺序)
sin_addr存储IP地址,使用in_addr这个数据结构
sin_zero是为了让sockaddr与sockaddr_in两个数据结构保持大小相同而保留的空字节。
s_addr按照网络字节顺序存储IP地址
sockaddr_in和sockaddr是并列的结构,指向sockaddr_in的结构体的指针也可以指向
sockadd的结构体,并代替它。也就是说,你可以使用sockaddr_in建立你所需要的信息,
在最后用进行类型转换就可以了bzero((char*)&mysock,sizeof(mysock));//初始化
mysock.sin_family=AF_INET;
mysock.sin_port=htons(8080);
mysock.sin_addr.s_addr=inet_addr(“192.168.0.1”);
……
等到要做转换的时候用:
(struct sockaddr*)&mysock
sockaddr_un
struct sockaddr_un
{sa_family_t sun_family; /*PF_UNIX或AF_UNIX */char sun_path[UNIX_PATH_MAX]; /* 路径名 */};
进程间通信的一种方式是使用UNIX套接字,人们在使用这种方式时往往用的不是网络套接字,而是一种称为本地套接字的方式。这样做可以避免为黑客留下后门。
创建
使用套接字函数socket创建,不过传递的参数与网络套接字不同。本地套接字的通讯类型应该是SOCK_STREAM或SOCK_DGRAM,协议为默认协议。例如:
int sockfd;sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
绑定
创建了套接字后,还必须进行绑定才能使用。不同于网络套接字的绑定,本地套接字的绑定的是struct sockaddr_un结构。struct sockaddr_un结构有两个参数:sun_family、sun_path。sun_family只能是AF_LOCAL或AF_UNIX,而sun_path是本地文件的路径。通常将文件放在/tmp目录下。例如:
注意:
通常在使用前会先调用unlink 删除掉这文件保证后面正常使用
unlink(filepath);struct sockaddr_un sun;sun.sun_family = AF_UNIX;strcpy(sun.sun_path, filepath);bind(sockfd, (struct sockaddr*)&sun, sizeof(sun));
监听
本地套接字的监听、接受连接操作与网络套接字类似。
连接
连接到一个正在监听的套接字之前,同样需要填充struct sockaddr_un结构,然后调用connect函数。
连接建立成功后,我们就可以像使用网络套接字一样进行发送和接受操作了。甚至还可以将连接设置为非阻塞模式。
附协议族
Linux kernel include:Name Purpose Man pageAF_UNIX Local communication unix(7)AF_LOCAL Synonym for AF_UNIXAF_INET IPv4 Internet protocols ip(7)AF_AX25 Amateur radio AX.25 protocol ax25(4)AF_IPX IPX - Novell protocolsAF_APPLETALK AppleTalk ddp(7)AF_X25 ITU-T X.25 / ISO-8208 protocol x25(7)AF_INET6 IPv6 Internet protocols ipv6(7)AF_DECnet DECet protocol socketsAF_KEY Key management protocol, originally de‐veloped for usage with IPsecAF_NETLINK Kernel user interface device netlink(7)AF_PACKET Low-level packet interface packet(7)AF_RDS Reliable Datagram Sockets (RDS) protocol rds(7)rds-rdma(7)AF_PPPOX Generic PPP transport layer, for settingup L2 tunnels (L2TP and PPPoE)AF_LLC Logical link control (IEEE 802.2 LLC)protocolAF_IB InfiniBand native addressingAF_MPLS Multiprotocol Label SwitchingAF_CAN Controller Area Network automotive busprotocolAF_TIPC TIPC, "cluster domain sockets" protocolAF_BLUETOOTH Bluetooth low-level socket protocolAF_ALG Interface to kernel crypto APIAF_VSOCK VSOCK (originally "VMWare VSockets") vsock(7)protocol for hypervisor-guest communica‐tionAF_KCM KCM (kernel connection multiplexor) in‐terfaceAF_XDP XDP (express data path) interface
Linux网络编程之sockaddr与sockaddr_in,sockaddr_un分析相关推荐
- Linux网络编程之sockaddr与sockaddr_in,sockaddr_un结构体详细讲解
Linux网络编程之sockaddr与sockaddr_in,sockaddr_un结构体详细讲解 (1)sockaddr struct sockaddr { unsigned short sa_ ...
- Linux网络编程之IP地址转换为无符号整数的方法
Linux网络编程之IP地址转换为无符号整数的方法,代码如下:(没考虑异常输入) #include <stdio.h> #include <string.h> #include ...
- Linux网络编程之TCP状态转移
Linux网络编程之TCP状态转移 一.TCP状态转移时序 二.半关闭及shutdown函数 一.TCP状态转移时序 TCP状态转移图: netstat -apn | grep client 查看客户 ...
- 嵌入式linux ntpd命令,嵌入式Linux网络编程之:实验内容——NTP协议实现
本文引用地址:http://www.eepw.com.cn/article/257114.htm 10.4实验内容--NTP协议实现 1.实验目的 通过实现NTP协议的练习,进一步掌握Linux网络编 ...
- Linux套接字编程之sockaddr与sockaddr_in网络套接字,sockaddr_un进程间通信本地套接字
sockaddr struct sockaddr { unsigned short sa_family; /* address family, AF_xxx */ char sa_dat ...
- linux网络编程之Socket编程
(1)socket套接字 1)在linux环境下,socket用于表示进程间网络通信的特殊文件类型,其本质是内核借助缓冲区形成的伪文件(不占磁盘空间,除此之外还有二进制文件,管道,字符文件). 2)伪 ...
- linux网络编程之socket编程(六)
经过一个国庆长假,又有一段时间没有写博文了,今天继续对linux网络编程进行学习,如今的北京又全面进入雾霾天气了,让我突然想到了一句名句:"真爱生活,珍惜生命",好了,言归正传. ...
- linux ioctl网络参数设置,Linux 网络编程之ioctl函数
1.介绍 Linux网络程序与内核交互的方法是通过ioctl来实现的,ioctl与网络协议栈进行交互,可得到网络接口的信息,网卡设备的映射属性和配置网络接口.并且还能够查看,修改,删除ARP高速缓存的 ...
- socket编程之sockaddr和sockaddr_in的区别
sockaddr和sockaddr_in的区别 sockaddr和sockaddr_in详解 1.struct sockaddr和struct sockaddr_in这两个结构体用来处理网络通信的地址 ...
最新文章
- Selenium3自动化测试——2. python编写简单自测代码
- Linux基本防护措施
- NYOJ 118 修路方案(次小生成树)
- jquery生成一个li_jquery-创建元素和添加子元素
- ajax跨域请求的问题
- Linux5配置jboss环境
- aelf帮助C#工程师10分钟零门槛搭建DAPP私有链开发环境
- Quick BI产品核心功能大图(四):Quick引擎加速--十亿数据亚秒级分析
- 为什么服务器要选择 Linux,这里总结了 10 大理由
- 【抠图工具】图片、视频自动抠图(VideoMatting)
- 一文了解 操作系统发展史
- 基于MFC的OpenDDS发布订阅例子(idl)
- javaweb框架 一些底层实现
- Linux常用软件包(常用命令)
- Pick定理、欧拉公式和圆的反演
- C语言学习教程免费分享
- 论文阅读《High-Definition Map Generation Technologies For Autonomous Driving: A Review》1
- 威联通文件传输服务器,QNAP NAS方案-------文件共享
- excel表格多个文件夹计算机,excle多文件并排_如何在电脑桌面并排显示多个excel...
- 还在跑遍武汉追樱花,这份武汉赏樱地图送给你
热门文章
- pandas读取⽂件的read_csv()⽅法的parse_dates参数
- CTF-安全杂项-功夫秘籍
- JDK源码系列:子线程如何继承父线程上通过ThreadLocal绑定的数据
- 免费版的mp3格式转换器有哪些?这三款软件帮你实现!
- lisp提取长方形坐标_如何利用lisp程序一次性提取CAD中点的坐标(不要点击每个点,太多了麻烦)...
- 如何在CAD图纸中提取各点的坐标?
- Android 检测设备是否为模拟器
- bim建筑绘图计算机要求,bim考试相关要求
- HashMap源码面试题
- 5分钟了解搜索引擎Lucene的原理