套接字地址结构

套接字编程中,五元组是广为人知的. (host_ip, host_port, target_ip, target_port, protocol).

其中 ipport 就是由套接字地址结构来表示的, 无论是Server端监听的 ipport 或是客户端连接的服务端的地址,都需要通过套接字地址结构来表示

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个: acceptrecvfromgetsocknamegetpeername

这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_namelenmsg_controllen字段

ifconfifc_len字段

sysctl 函数两个长度参数中的一个


字节排序函数

在网络通信中统一使用大端字节序(即网络字节序)

在套接字地址结构中, 以sockaddr_in 为例, sin_portsin_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的准备(一)的更多相关文章

  1. Another MySQL daemon already running with the same unix socket的解决

    问题出现: 每周一需要备份一次数据库,即从服务器MySQL导出sql文件,再导入到我机器上虚拟机的MySQL里.但是今天早上连不上,我进入控制台用#service mysqld start强行启动,报 ...

  2. Nginx 中 fastcgi_pass 监听端口 unix socket和tcp socket差

    Nginx 中 fastcgi_pass 监听端口 unix socket和tcp socket差别   Nginx连接fastcgi的方式有2种:unix domain socket和TCP,Uni ...

  3. 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 特征 ...

  4. 启动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 ...

  5. 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 ...

  6. unicorn与nginx通讯--[ruby unix socket]

    [龍昌博客] http://www.xefan.com/archives/84146.html unicorn是如何与nginx通讯的——介绍ruby中的unix socket Ruby 应用服务典型 ...

  7. [daily][netcat] 在UNIX socket上使用netcat

    概述 默认情况下,系统里边带的netcat,也就是nc.支持tcp,udp,ipv4,ipv6但是不支持unix socket. 而且,telnet也不支持. 除非自己写一个,不然很不方便. 另一个n ...

  8. 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 ...

  9. tcp socket/ unix socket

    A UNIX socket is an inter-process communication mechanism that allows bidirectional data exchange be ...

  10. 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无法建立,权限问 ...

随机推荐

  1. git基本操作,一篇文章就够了!

    1. git简介 git的通用操作流程如下图(来源于网络) 主要涉及到四个关键点: 工作区:本地电脑存放项目文件的地方,比如learnGitProject文件夹: 暂存区(Index/Stage):在 ...

  2. UVA-11167 Monkeys in the Emei Mountain(区间模型最大流+输出方案)

    题目大意:有n只猴子,每只猴子都有一组参数(v,a,b),表示这只猴子在时间段[a,b]之间必须要喝v个单位水,并且每个时间单位只能和一个单位水,每次至少喝一个单位.但是只有一个水池,并且这个水池最多 ...

  3. UVALive-3268 Jamie's Contact Groups (最大流,网络流建模)

    题目大意:你的手机通讯录里有n个联系人,m个分组,其中,有的联系人在多个分组里.你的任务是在一些分组里删除一些联系人,使得每个联系人只在一个分组里并且使人数最多的那个分组人数最少.找出人数最多的那个分 ...

  4. LTE空口协议——是空口3GPP协议 不是网络IP协议

    [LTE基础知识]LTE空口协议分析 from:https://www.mscbsc.com/viewnews-102038.html控制面协议 控制面协议结构如下图所示. PDCP在网络侧终止于eN ...

  5. 在JavaScript中进行文件处理,第二部分:文件读取

    译注:原文是<JavaScript高级程序设计>的作者Nicholas Zakas写的,本翻译纯属为自己学习而做,仅供参考.原文链接:这里 在我的前一篇blog中,我介绍了在JavaScr ...

  6. Chrome即将封杀Google Earth、Google Talk等插件

    昨日,Chrome安全工程师Justin Schuh在官方博客中写道,到明年一月份,谷歌将封杀一系列基于NPAPI框架标准的浏览器插件.其中包括谷歌地球(Google Earth).Google Ta ...

  7. Ubuntu 16.04系统开机紫屏的解决办法

    具体症状为卡在开机界面,按任何键都无反应. 网上查看了几篇文章 ,如下: 解决:ubuntu16.04启动时长时间停留在紫屏或跳文本的黑屏界面 Ubuntu16.04显卡驱动 电源管理 里面提到的开机 ...

  8. JS中的phototype详解

    作者:轩脉刃 1 原型法设计模式 在.Net中可以使用clone()来实现原型法 原型法的主要思想是,现在有1个类A,我想要创建一个类B,这个类是以A为原型的,并且能进行扩展.我们称B的原型为A. 2 ...

  9. java并发编程之二--CountDownLatch的使用

    CountDownLatch类 允许一个或多个线程等待直到在其他线程中执行的一组操作完成的同步辅助. CountDownLatch能够使一个线程在等待另外一些线程完成各自工作之后,再继续执行.使用一个 ...

  10. Django 之 Ajax

    此次主要是做省市区的三级联动. 环境:django 1.10 1. urls.py # coding:utf-8 from django.conf.urls import url import vie ...