Unix socket的准备(一)
套接字地址结构
套接字编程中,五元组是广为人知的. (host_ip, host_port, target_ip, target_port, protocol).
其中 ip 和 port 就是由套接字地址结构来表示的, 无论是Server端监听的 ip 和 port 或是客户端连接的服务端的地址,都需要通过套接字地址结构来表示
ipv4 套接字结构
# <netinet/in.h>
struct in_addr{ /* Network byte order*/
in_addr_t s_addr; /* 32-bit IPV4 address*/
};
struct sockaddr_in{
uint8_t sin_len;
sa_family_t sin_family; /* Address family, default: AF_INET */
in_port_t sin_port; /* 16 bit port num: Network byte order */
struct in_addr sin_addr; /* 32 bit ip addr: network byte order */
char sin_zero[8]; /* Unused */
};
在Linux的套接字结构中并没有sin_len 成员. POSIX规范中也不要求有这个成员. POSIX规范只需要这个结构中的3个字段 sin_family, sin_addr, sin_port. 几乎所有的实现都增加了sin_zero成员.
其中sin_port成员和sin_addr成员是网络字节序,需要使用字节排序函数处理。
通用套接字地址结构
将套接字结构(ipv4/ipv6/unix sock)传递给内核时需要转成通用的套接字地址结构。
struct sockaddr{
uint8_t sa_len;
sa_family_t sa_family;
char sa_data[14];
};
值-结果参数
从内核到进程传递套接字地址结构的函数有4个: accept、 recvfrom、getsockname、getpeername
这4个函数中的两个参数都是指向某个套接字地址结构的指针和表示该结构大小的整形变量的指针
struct sockaddr_un cli; /* Unix domain*/
socklen_t len = sizeof(cli);
getpeername(unixfd, (sockaddr*) &cli, &len); /* len may have changed*/
这里使用的是len的指针,而不是len,原因在于:当函数被调用时,结构大小是一个值(value),它告诉内核该结构的大小,这样内核在写该结构时不至于越界;当信息返回时,结构大小又是一个结果(result),它告诉进程内核在该结构中究竟存了多少信息.这种类型的参数称为 值-结果(value-result)参数.
值-结果参数从内核中获取数据的调用中经常会用到. 在网络编程中除了从内核中获取套接字地址的调用外,下面的函数同样也使用了值-结果参数
select函数中间的3个参数
getsockopot函数的长度参数
使用recvmsg函数,msghdr结构中的msg_namelen和msg_controllen字段
ifconf中ifc_len字段
sysctl函数两个长度参数中的一个
字节排序函数
在网络通信中统一使用大端字节序(即网络字节序)
在套接字地址结构中, 以sockaddr_in 为例, sin_port 和 sin_addr存储的port和ip均为网络字节序,
那么对于端口号为8080的端口来说,需要将8080转为网络字节序,才能放到套接字地址结构中。为此我们有字节序转换函数:
#include <netinet/in.h>
uint16_t htons(uint16_t host16bitvalue); // 返回:网络字节序
uint32_t htonl(uint32_t host32bitvalue);
uint16_t ntohs(uint16_t net16bitvalue);
uint16_t ntohl(uint16_t net32bitvalue); // 返回:主机的字节序
我们并不关心主机字节序和网络字节序的真实值,我们需要做的调用上述函数在套接字地址结构中存入转后的值就可以。
在那些主机为大端字节序的机器中,四个函数通常被定义为空宏。
Unix socket的准备(一)的更多相关文章
- Another MySQL daemon already running with the same unix socket的解决
问题出现: 每周一需要备份一次数据库,即从服务器MySQL导出sql文件,再导入到我机器上虚拟机的MySQL里.但是今天早上连不上,我进入控制台用#service mysqld start强行启动,报 ...
- Nginx 中 fastcgi_pass 监听端口 unix socket和tcp socket差
Nginx 中 fastcgi_pass 监听端口 unix socket和tcp socket差别 Nginx连接fastcgi的方式有2种:unix domain socket和TCP,Uni ...
- Unable to start MySQL service. Another MySQL daemon is already running with the same UNIX socket
Unable to start MySQL service. Another MySQL daemon is already running with the same UNIX socket 特征 ...
- 启动Mysql报错:Another MySQL daemon already running with the same unix socket.
启动Mysql报错: Another MySQL daemon already running with the same unix socket. 删除如下文件即可解决 /var/lib/mysql ...
- MySQL“Another MySQL daemon already running with the same unix socket” 报错信息处理
Mysql "Another Mysql daemon already running with the same unix socket" 解决办法:rm var/lib/mys ...
- unicorn与nginx通讯--[ruby unix socket]
[龍昌博客] http://www.xefan.com/archives/84146.html unicorn是如何与nginx通讯的——介绍ruby中的unix socket Ruby 应用服务典型 ...
- [daily][netcat] 在UNIX socket上使用netcat
概述 默认情况下,系统里边带的netcat,也就是nc.支持tcp,udp,ipv4,ipv6但是不支持unix socket. 而且,telnet也不支持. 除非自己写一个,不然很不方便. 另一个n ...
- docker启动失败(can't create unix socket /var/run/docker.sock: is a directory)
现象 # service docker start Redirecting to /bin/systemctl start docker.service Job for docker.service ...
- tcp socket/ unix socket
A UNIX socket is an inter-process communication mechanism that allows bidirectional data exchange be ...
- mysqld Can’t start server : Bind on unix socket: Permission denied
启动mysql报错: mysqld Can’t start server : Bind on unix socket: Permission denied 原因: mysql.sock无法建立,权限问 ...
随机推荐
- 如何借助 OVN 来提高 OVS 在云计算环境中的性能
众所周知,OpenvSwitch 以其丰富的功能和不错的性能,已经成为 Openstack 部署中最受欢迎的虚拟交换机.由于 Openstack Neutron 的架构引入了一些性能问题,比如 neu ...
- 配置github的SSH key及GitHub项目上传方式一——使用终端命令行
GitHub是一个开源的大仓库,我们经常从github上下载项目进行学习和研究,下面是一个完整的步骤——往GitHub上传一个新项目. 一.注册GitHub账号 1.注册GitHub账号,地址:htt ...
- java中字面量,常量和变量之间的区别(附:Integer缓存机制)
一.引子 在各种教科书和博客中这三者经常被引用,今天复习到内存区域,想起常量池中就是存着字面量和符号引用,其实这三者并不是只在java中才有,各个语言中都有类似的定义,所以做一下总结,以示区分. 二. ...
- 浅谈Android Studio3.0更新之路(遇坑必入)
>可以参考官网设置-> 1 2 >> Fantasy_Lin_网友评论原文地址是:简书24K纯帅豆写的我也更新一下出处[删除]Fa 转自脚本之家 浅谈Android Studi ...
- Confluence 6 创建一个用户宏
如果你想创建自定义的宏的话,用户宏能够帮你完成这个任务.这个可以在你系统中应用特定的操作,比如说应用自定义格式等. 用户用是在 Confluence 创建和和管理的,你需要有一定的编码基础才可以. 你 ...
- myeclipse出现src作为报名一部分src.com.*
打开历史悠久的项目,所有类报错,发现src变成了报名的一部分. 右击src->Build Path->Use as Source Folder即可. WebRoot中同理.
- 在使用DBMS_LOB.WRITEAPPEND()追加Clob内容的时候,报数字或值异常
在实际的使用中有可能会使用DBMS_LOB.WRITEAPPEND()去将Clob内容作为buffer增加到我们需要的对象中,但是在实际的使用中Clob大小往往是超过32767长度的,然而DBMS_L ...
- URAL 1136 Parliament (DFS)
题意 输入一棵树的后缀表达式(按左-右-中顺序访问),这棵树的每一个结点的数值都比它的左子树结点的数值大,而比它的右子树结点的数值小,要求输出其按右-左-中顺序访问的表达式.所有的数都为正整数,而且不 ...
- EPANET头文件解读系列4——EPANET2.H
该头文件的功能与系列3中的TOOLKIT.H类似,而且内容也几乎一致,所以也就不再详细介绍.
- sgu 146. The Runner 取模技巧 难度:1
146. The Runner time limit per test: 0.25 sec.memory limit per test: 4096 KB input: standard inputou ...