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



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

看官们,我们在上一回中介绍了socket通信的步骤,当时提到了实现这些步骤使用的系统调用,当时有些看官不理解这些系统调用,今天我们趁热打铁来介绍这些系统调用。

int socket(int domain, int type, int protocol)
  • 该函数用来创建一个socket;
  • 该函数的三个参数分别对应socket的三个属性:域,类型和协议;
  • 该函数运行成功时返回套接字描述符,运行失败时返回-1;

使用该函数时需要包含的头文件为: #include <sys/socket.h>,该文件中包含了socket通信相关的系统调用,我们在本章回中介绍的系统调用都需要包含该头文件。此外,该函数的第三个参数通常为0,表示使用默认的通信协议。

int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen)
  • 该函数用来在客户端和服务器端建立一个连接;
  • 该函数的第一个参数是客户端的套接字描述符;
  • 该函数的第二个参数是服务器端的地址,地址中包含着详细的服务器信息;
  • 该函数的第三个参数是服务器端地址的长度,也就是第二个参数的长度;
  • 该函数运行成功时返回0,运行失败时返回-1;
int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen)
  • 该函数用来把服务器端的套接字和服务器的地址绑定在一起;
  • 该函数的第一个参数是服务器端的套接字描述符;
  • 该函数的第二个参数是服务器的地址,地址中包含着详细的服务器信息;
  • 该函数的第三个参数是服务器端地址的长度,也就是第二个参数的长度;
  • 该函数运行成功时返回0,运行失败时返回-1;
int listen(int sockfd, int backlog)
  • 该函数用来在服务器端创建套接字队列,以便服务器监听客户端发来的通信连接请求;
  • 该函数的第一个参数是服务器端的套接字描述符;
  • 该函数的第二个参数是套接字队列的长度,也就是服务器允许接受的通信连接请求数量;
  • 该函数运行成功时返回0,运行失败时返回-1;

关于服务器允许接受的通信连接请求数量是一个重要的数值,不能太大。设置该值时要参考服务器的负载能力和服务器的处理能力,不然会让服务器崩溃。服务器本质上也是一台电脑,只是性能比我们日常使用的电脑好一些,如果你在自己的电脑上打开成百上千个程序,电脑就会慢的像个蜗牛,甚至死机。同理,如果在服务器上打开的连接太多,服务器也会崩溃。这点我相信大家很容易理解,因此就不多说了。

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen)
  • 该函数可以让服务器端接受客户端发来的连接请求,让服务器端和客户端建立连接;
  • 该函数的第一个参数是服务器端的套接字描述符;
  • 该函数的第二个参数是客户端的地址,注意不是服务器的地址;
  • 该函数的第三个参数是客户端地址的长度,也就是第二个参数所指向地址的长度;
  • 该函数运行成功时返回套接字描述符,运行失败时返回-1;

关于该函数要做以下的说明,就当作是一些注意事项吧:

  • 该函数的最后两个参数都是指针,调用该函数前所指的内容为空,调用该函数后会获取客户端的地址及其 长度。该指针所指区域需要容纳客户端地址,如果不想了解客户端的地址,使用空指针也是可以的。
  • 该函数创建了一个新的套接字,套接字的描述符就是它返回的套接字描述符,新套接字描述符的类型与服 务器端套接字描述符的类型相同。我们通过该套接字来与客户端进行通信,而服务器端原来的套接字,也 就是函数中第一个参数所代表的套接字则继续处于监听状态,准备接受客户端发来的其它请求。
  • 该函数具有阻塞功能,如果在listen创建的套接字队列中没有连接请求,那么就会阻塞,直到队列中有新的连接请求时才会运行。
int shutdown(int sockfd, int how)
  • 该函数用来关闭使用套接字建立的通信连接;
  • 该函数的第一个参数是套接字描述符,该函数将关闭与它关联的通信连接;
  • 该函数的第二个参数是关闭连接的方式,请参考下面的介绍;
  • 该函数运行成功时返回0,运行失败时返回-1,同时设置errno全局变量;

回想一下,我们在前面章回中介绍管道的时候,使用管道进行进程间通信时,管道是单向的,管道两端的任何一方只能读或者写操作,如果想在任何一方同时进行读写操作,那么就需要再建立一个管道。但是使用套接字建立的通信连接是双向的,也就是说我们在客户端或者服务器端中的任何一方都可以进行读写操作。使用close函数时会把套接字通信连接的两端都关闭,有时候我们只需要关闭其中的一端,这个时候该函数就派上了用场。我们通过该函数的第二个参数来控制关闭的方向,该参数的值可以是以下三种之一:

  • SHUT_RD(表示关闭连接的读方向,与此同时,连接的另一端不能通过该连接写数据)
  • SHUT_WR(表示关闭连接的写方向,与此同时,连接的另一端不能通过该连接读数据)
  • SHUT_RDWR(表示关闭连接的读写方向,与此同时连接的另一端不能通过该连接写数据和读数据)

该函数在操作上比close灵活一些,可以看作是对close函数的扩展。

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


时间: 2025-01-02 09:25:19

一起talk C栗子吧(第一百四十九回:C语言实例--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主要有三个属性: 域(domain) 类型(type) 协议(protocol) 域表示socket的通信范围.比如,我们通过互联网通信时使用的域为AF_INET(表示IPv4,与现在使用的IPv6对应的域是AF_INET6),我们在本地通

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

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

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

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

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

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

一起talk C栗子吧(第十二回:C语言实例--单链表一)

各位看官们,大家好,从今天开始,我们讲大型章回体科技小说 :C栗子,也就是C语言实例.闲话休提, 言归正转.让我们一起talk C栗子吧! 看官们,上一回中咱们没有说具体的例子,而且是说了例子中的文件组织结构.这一回咱们继续说C例子, 说的例子是链表,更准确的说法叫作单链表.咱们不但要说C例子,而且会在例子中使用上一回中说过的 文件组织结构,就当作是举例说明文件组织结构的使用方法. 有点一石二鸟的感觉,哈哈. 链表定义 看官们,所谓的链表其实就是一组元素通过一定的方式链接在一起.比如我们坐的火车

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

各位看官们,大家好,上一回中咱们说的是socket通信接口的例子,这一回咱们说的是socket通信地址.闲话休提,言归正转.让我们一起talk C栗子吧! 看官们,我们使用socket通信时需要知道通信的地址,这好比我们发电子邮件时需要有一个邮件地址一样.其实我们在介绍socket通信接口时就提到过通信地址,只是没有详细介绍而已,当时还有客户提问呢.今天我们将详细介绍socket的通信地址. socket的通信地址主要是用来标识通信双方,用程序的观点来看,就是用来标识程序中通信的计算机以及其进程

一起talk C栗子吧(第一百四十四回:C语言实例--文件操作大结局)

各位看官们,大家好,上一回中咱们说的是基于文件指针进行文件操作的例子,这一回咱们说的是文件操作大结局.闲话休提,言归正转.让我们一起talk C栗子吧! 看官们,我们在前面章回中介绍了文件操作的两种途径:文件描述符和文件指针.今天我们将对这两种文件操作途径进行总结和对比. 我们先看看它们的共同点: 1.口味相同:都喜欢吃文件(都能用来操作文件): 2.生活方式相同:日出而作,日落而息(使用它们时都是按照文件操作三步曲进行:打开,操作,关闭): 3.都不省心:使用时容易引起错误,需要检查使用后的结

一起talk C栗子吧(第一百四十五回:C语言实例--socket概述)

各位看官们,大家好,上一回中咱们说的是基于文件指针进行文件操作的例子,这一回咱们说的例子是socket概述.闲话休提,言归正转.让我们一起talk C栗子吧! 看官们,我们今天主要介绍socket."前面章回中还在介绍文件操作,怎么突然来说这个叫socket的东西呢?"这里有看官在问了,看官莫急,我们之所为介绍socket,是因为它有点类似文件操作中的文件描述符.说类似有点不太准确,其实socket本质上就是文件描述符.我们可以使用read,write等系统调用来操作socket.当然