各位看官们,大家好,上一回中咱们说的是socket通信接口的例子,这一回咱们说的是socket通信地址。闲话休提,言归正转。让我们一起talk C栗子吧!

看官们,我们使用socket通信时需要知道通信的地址,这好比我们发电子邮件时需要有一个邮件地址一样。其实我们在介绍socket通信接口时就提到过通信地址,只是没有详细介绍而已,当时还有客户提问呢。今天我们将详细介绍socket的通信地址。

socket的通信地址主要是用来标识通信双方,用程序的观点来看,就是用来标识程序中通信的计算机以及其进程。通过通信地址可以知道哪些计算机在进行通信,甚至可以知道计算机中的某个进程在通信。比如数据是从哪个计算机发来的,准备发到哪个计算机中。

我们使用常见的电子邮件做对比,我们可以通过电子邮件的发信人地址知道邮件是由谁发来的,也可以通过收信人地址知道谁会收到邮件。这里的电子邮件地址就好比通信地址,收信人和发信人就好比通信中的计算机。都叫计算机时,大家觉得有点乱,为了方便大家区分计算机,通常情况下,我们把发送数据的计算机叫作客户端,接收数据的计算机叫作服务器。通过通信地址,我们就可以知道客户端和服务器的信息,或者更加确切地说,我们可以知道哪些客户端在和哪些服务器进行通信。

socket的通信地址有固定的格式,就像我们使用的电子邮件地址一样。比如xxx@xxx.com是一个电子邮件地址,该地址中总是使用@符号,该符号前面是邮件名称,后面是邮件服务商的域名。socket的通信地址也有固定的格式,不过通信地址的格式与socket的域有关,不同的通信域有不同的通信地址。接下来我们分别做介绍:

AF_UNIX域的通信地址格式

该类型的通信主要是在同一台计算机的不同进程之间进行通信,因此,通信地址本质上是文件路径,只不过这里说的文件不是普通文件,而是专门用来通信的socket类型的文件。

下面是该类型地址格式的详细定义,该定义位于../include/uapi/linux/un.h文件中

#define UNIX_PATH_MAX   108struct sockaddr_un {__kernel_sa_family_t sun_family; /* AF_UNIX */char sun_path[UNIX_PATH_MAX];   /* pathname */
};

从上面的类型定义中可以看到,该类型是一个结构体类型,结构体包含有两个成员:

  • sun_family成员表示套接字通信的域;
  • sun_path成员表示文件路径,路径长度定义为108个字符。

此外,从该定义中我们也可以看到AF_UNIX域的通信地址是通过文件地址实现的。

AF_INET域的通信地址格式

该类型的通信主要是在网络中不同的计算机中之间进行通信,因此,通信地址本质上计算机名和端口号。通过计算机名可以找到计算机,通常我们使用计算机的IP地址而不是计算机名来区分网络中的计算机。

使用端口号是为了给计算机指定一个具体的进程。比如我们通过计算机的80号端口来访问网络,实际上是在使用计算机的web进程和网络服务器中的进程进行通信。总之,对于AF_INET域的通信地址来说,我们可以将它的本质归纳为IP地址+端口号。

下面是该类型地址格式的详细定义,该定义位于../include/uapi/linux/in.h文件中

struct sockaddr_in {__kernel_sa_family_t  sin_family;     /* Address family               */__be16                sin_port;       /* Port number                  */struct in_addr        sin_addr;       /* Internet address             *//* Pad to size of `struct sockaddr'. */unsigned char         __pad[__SOCK_SIZE__ - sizeof(short int) -sizeof(unsigned short int) - sizeof(struct in_addr)];
};

从上面的类型定义中可以看到,该类型是一个结构体类型,结构体包含有四个成员:

  • sun_family成员表示套接字通信的域;
  • sin_addr成员表示计算机的IP地址;
  • sin_port成员表示计算机的端口号;
  • __pad成员表示地址的长度;

此外,从该定义中我们也可以看到AF_INET域的通信地址在本质上是计算机IP地址和计算机端口号的组合。

通用的通信地址格式

套接字的通信地址也有一个通用的地址格式,它主要是为了把不同的地址格式转换成通用的地址格式,以方便我们在通信接口中使用。下面是该格式的定义,它位于socket.h文件中:

struct sockaddr {sa_family_t     sa_family;      /* address family, AF_xxx       */char            sa_data[14];    /* 14 bytes of protocol address */
};

从上面的定义中可以看到它是一个结构体类型,并且有两个成员:

  • sa_family成员表示通信的域;
  • sa_data 成员表示通信地址;

看官们,我们介绍了这么多关于通信地址的内容,就是为了让大家了解通信地址的格式,当我们在程序中使用通信地址的时候,就能依据通信地址的格式来填写通信地址。当使用套接字通信的时候,我们就可以直接使用已经填写好的通信地址进行通信了。

各位看官,关于socket通信地址的例子咱们就说到这里。欲知后面还有什么例子,且听下回分解 。


一起talk C栗子吧(第一百五十一回:C语言实例--socket通信地址)相关推荐

  1. 第一卷清晨的帝国 第一百五十一章 起步

    艰难负重前行,每一次抬足挥臂,仿佛都要用出全身的力气,行走在书院后山石径上的年轻人们,就像是被棉线提着的木偶.虽然看不到他们的表情,但留在书院里的人们,仿佛能够清晰体察到他们此时承受的痛苦. 二层楼选 ...

  2. 第一百五十一节,封装库--JavaScript,表单验证--密码确认验证--回答验证--电子邮件验证加自动补全...

    封装库--JavaScript,表单验证--密码确认验证--回答验证--电子邮件验证加自动补全 效果图 html <div id="reg"><h2 class= ...

  3. 一起talk C栗子吧(第一百九十六回:C语言实例--DIY less命令五 )

    各位看官们,大家好,上一回中咱们说的是DIY less命令的例子,这一回咱们继续说该例子.闲话休提,言归正转.让我们一起talk C栗子吧! 看官们,我们对DIY的less的介绍已经有四个章回了,这一 ...

  4. 第一百五十一期:最新计算机技能需求排名出炉:Python仅排第三,第一你猜得到吗?

    除了编程语言之外,要想找一份计算机相关的工作,还需要很多其他方面的技能.最近,来自美国求职公司 Indeed 的一份报告显示:在全美工作技能需求中,数据库语言 SQL.编程语言 Java 分列前两位. ...

  5. 一起talk C栗子吧(第一百六十七回:C语言实例--控制终端字符颜色)

    各位看官们,大家好,上一回中咱们说的是大小写字符转换的例子,这一回咱们说的例子是:控制终端字符颜色 .闲话休提,言归正转.让我们一起talk C栗子吧! 看官们,我们在Linux终端中使用Linux命 ...

  6. 一起talk C栗子吧(第一百二十三回:C语言实例--显示变量和函数的地址)

    各位看官们,大家好,上一回中咱们说的是多线程的样例.这一回咱们说的样例是:显示变量和函数的地址. 闲话休提,言归正转.让我们一起talk C栗子吧! 在编敲代码时,有时候须要获取程序中变量和函数的地址 ...

  7. leecode第一百五十五题(最小栈)

    class MinStack { public:stack<int> cur_stack;stack<int> cur_min;//用来存储最小值的栈int min_num;M ...

  8. 第一百五十三期: 云迁移可能失败的5种方式以及成功的5种方式

    通过将应用程序迁移到云平台中,企业可以提高安全性.数据访问.可扩展性和IT灵活性.将业务迁移到云平台还可以为企业节省成本.以下是导致企业云迁移失败的五个主要原因以及其解决方法. 作者:Andy Pat ...

  9. 第一百五十期:Java程序员必备:异常的十个关键知识点

    总结了Java异常十个关键知识点,面试或者工作中都有用哦,加油.异常是指阻止当前方法或作用域继续执行的问题.比如你读取的文件不存在,数组越界,进行除法时,除数为0等都会导致异常.  前言 总结了Jav ...

  10. 一起talk C栗子吧(第一百九十三回:C语言实例--DIY less命令二 )

    各位看官们,大家好,上一回中咱们说的是DIY less命令的例子,这一回咱们继续说该例子.闲话休提,言归正转.让我们一起talk C栗子吧! 看官们,看了上一回的内容,相信大家意犹未尽,我们趁热打铁, ...

最新文章

  1. python中如何对复杂的json数据快速查找key对应的value值(使用JsonSearch包)
  2. 双列集合,往treeMap里添加元素的时候注意的事项
  3. c语言x的2取模_c语言如何取模运算
  4. python条件查询 或 in_64.Python中ORM查询条件:in和关联模型
  5. 【预告】1月6日下午14:30 CLR开发系列课程(3):COM Interop基础 (Level 300)
  6. java画虚线_java cansvas 画虚线要怎么设置?
  7. python适合什么样的人群_什么样的人比较适合选择Python开发+人工智能技术?
  8. 辨析矩阵内积(hadamard、kronecker)
  9. Android Activity的4种启动模式详解(示例)
  10. mysql数据库性能跟哪些参数有关系_MySQL性能优化全攻略-服务器参数调整
  11. STM32输出比较模式和PWM模式 比较
  12. Windows下使用VS2008+CUDA3.0开发的详细配置 (Setup CUDA 3.0 on VS2008 in Windows)
  13. oracle 卸载asm,卸载oracleasm实验模拟
  14. Word文件的OpenXML解析(以Python3为例)
  15. docker安装php拓展
  16. Androidstudio之菜单栏设置
  17. python day46
  18. 加密币Terra创始人权道亨已从新加坡飞往杜拜转往第三国
  19. 服务器打包文件工具,项目增量发版之全自动打包流程(patch-generator-desk打包软件)...
  20. EI期刊《系统工程与电子技术》投稿经历

热门文章

  1. python匿名函数if判断_python--推导式、匿名函数
  2. Vue中利用websocket实现实时通讯
  3. 完美解决Qt error C2664: 无法将参数 1 从“const char []”转换为“char *
  4. 论道商业WiFi:商业WiFi技术大起底
  5. 英语中很有趣的10个句子
  6. 如何学好计算机论文500字,怎样学好数学作文500字
  7. Oracle EBS AP发票验证复选框为灰色
  8. React项目:Must use import to load ES Module
  9. ctfshow 网络迷踪-新手上路
  10. WORD使用教程笔记