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



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

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

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

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

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

AF_UNIX域的通信地址格式

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

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

#define UNIX_PATH_MAX   108

struct 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通信地址的例子咱们就说到这里。欲知后面还有什么例子,且听下回分解 。


时间: 2024-08-06 01:11:55

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

一起talk C栗子吧(第一百五十三回:C语言实例--socket通信地址系统调用一)

各位看官们,大家好,上一回中咱们说的是计算机中大小端的例子,这一回咱们说的例子是socket通信地址的系统调用 .闲话休提,言归正转.让我们一起talk C栗子吧! 看官们,我们在前面的章回中介绍了套接字的通信地址,这一回中我们将介绍操作套接字通信地址的系统调用.大家都知道套接字的通信地址与套接字的域有关,接下来,我们依据套接字的通信域分别进行介绍. AF_UNIX域的通信地址 AF_UNIX域的通信地址本质上是文件的目录,文件目录存储在本地计算机中,而且使用该域通信时,通信双方都位于同一台计算

一起talk C栗子吧(第一百五十四回:C语言实例--socket通信地址系统调用二)

各位看官们,大家好,上一回中咱们说的是socket通信地址系统调用的例子,这一回咱们继续说该例子.闲话休提,言归正转.让我们一起talk C栗子吧! 看官们,我们在上一回介绍的通信地址系统调用有效地解决了数据存储方式的问题,不过,还有一个系统调用也可以解决这种问题,这一回我们将介绍该系统调用:getaddrinfo. 函数原型 该系统调用从其名字上看是用来获取地址的信息,这里的地址主要指套接字通信地址.它获取到的地址信息不需要进行字节序转换,我们可以直接用来进行套接字通信.不过,我们不能只看名字

一起talk C栗子吧(第一百二十一回:C语言实例--线程知识体系图)

各位看官们,大家好,上一回中咱们说的线程属性的例子,这一回咱们说的例子是:线程知识体系图.闲话休提,言归正转.让我们一起talk C栗子吧! 我们在前面的章回中介绍了与线程相关的知识,在今天的章回中,我们将对这些知识进行总结,并且整理成一张知识体系图,方便大家掌握线程相关的知识. 下面是我们整理的知识体系图,请大家参数: 上图内容中的知识点都有相应的章回对应,下面是我整理的章回对应关系.为了大家方便,我设置了链接,大家可以直接点击链接跳到相应的章回中. 线程概念 线程概念:第一百零七回 线程标识

一起talk C栗子吧(第一百五十七回:C语言实例--基于AF_UNIX域的数据报套接字通信)

各位看官们,大家好,上一回中咱们说的是基于AF_UNIX域的流套接字通信的例子,这一回咱们说的例子是:基于AF_UNIX域的数据报套接字通信 .闲话休提,言归正转.让我们一起talk C栗子吧! 看官们,我们在上一回中一起制作了我们的第一道佳肴是:基于AF_UNIX域的流套接字通信.今天,我将和大家一起制作第二道佳肴:基于AF_UNIX域的数据报套接字通信. 制作第二道佳肴的菜谱:数据报套接字过程. 制作第二道佳肴的食材:数据报套接字的接口,套接字属性,套接字地址信息. 看官们,以上的内容,我们

一起talk C栗子吧( 第一百五十回:C语言实例--socket通信接口二)

各位看官们,大家好,上一回中咱们说的是socket通信的例子,这一回咱们继续说该例子.闲话休提,言归正转.让我们一起talk C栗子吧! 看官们,我们在上一回中介绍了套接字通信过程中使用的系统调用,这些系统调用具有通用性,在任何类型的套接字通信过程中都可以使用它们.今天,我们将介绍一些专门用来通过套接字发送和接收数据的系统调用.这些系统调用的功能十分相似,只是在操作的细节上不相同.接下来我们分别介绍他们. 发送数据的系统调用 ssize_t send(int sockfd, const void

一起talk C栗子吧(第一百四十九回:C语言实例--socket通信三)

各位看官们,大家好,上一回中咱们说的是socket通信的例子,这一回咱们继续说该例子.闲话休提,言归正转.让我们一起talk C栗子吧! 看官们,我们在上一回中介绍了socket通信的步骤,当时提到了实现这些步骤使用的系统调用,当时有些看官不理解这些系统调用,今天我们趁热打铁来介绍这些系统调用. int socket(int domain, int type, int protocol) 该函数用来创建一个socket; 该函数的三个参数分别对应socket的三个属性:域,类型和协议: 该函数运

一起talk C栗子吧(第一百四十八回:C语言实例--socket通信二)

各位看官们,大家好,上一回中咱们说的是socket通信的例子,这一回咱们继续说该例子.闲话休提,言归正转.让我们一起talk C栗子吧! 看官们,我们在上一回中介绍了套接字的通信步骤,限于时间的原因, 我们只介绍了流套接字的通信步骤.这一回中我们将介绍数据报套接字的通信步骤. 下面是客户端和服务器端实现通信的详细步骤: 客户端实现通信的步骤: 1.创建客户端套接字(socket): 2.设置客户端套接字的属性:域,类型和协议: 3.通过操作客户端套接字来实现客户端与服务器的通信(sendto,r

一起talk C栗子吧(第一百四十七回:C语言实例--socket通信一)

各位看官们,大家好,上一回中咱们说的是socket属性的例子,这一回咱们说的例子是socket通信.闲话休提,言归正转.让我们一起talk C栗子吧! 看官们,我们在前面章回中介绍了socket的基本概述,这一回中我们将介绍如何使用socket来实现两个进程之间的通信.为了方便大家理解socket通信的方式,我们把通信的双方分别称作客户端和服务器端.大家都知道,套接字有两种类型:流套接字和数据报套接字.不同类型的套接字,通信的方式也不同,本章回中我们先介绍流套接字的通信方式,数据报套接字的通信方

一起talk C栗子吧(第一百三十一回:C语言实例--C程序内存布局三)

各位看官们,大家好.上一回中咱们说的是C程序内存布局的样例,这一回咱们继续说该样例.闲话休提,言归正转.让我们一起talk C栗子吧. 看官们,关于C程序内存布局的样例,我们在前面的两个章回都介绍过了,这一回我们将对前面章回中的内容进行总结和提示. 内存布局总结 C程序的内存布局主要有四个分区:代码区,数据区(data和bss).堆区和栈区.能够使用readelf -S filename查看各个分区的内存地址.这四个分区在内存中从低地址空间開始依次向高地址延伸.我们再次使用前面章回中的图直观地展