首页 > C语言网络编程:TCP编程模型

C语言网络编程:TCP编程模型

编程模型

TCP编程模型如下

在这里插入图片描述

TCP服务器的工作过程如下:

  • 服务器创建一个专门的“文件描述符”来监听来自客户端的“三次握手”,然后建立链接
  • 链接建立成功后,服务器会分配一个专门的“通信文件描述符”,用于实现与该客户端的通信

以上通信模型是由于TCP本身的特点:面向连接的,可靠的,字节流通信方式

通信过程

服务器:

  • 创建套接字,返回套接字的文件描述符skfd = socket()
  • 将套接字文件描述符、ip、端口号绑定在一起,建立固定的对应关系bind()
  • 将套接字文件描述符转为被动描述符,用于被动监听客户端链接listen()
  • 与客户端三次握手成功,返回一个通信描述符 fd=accept()
  • 服务器向客户端发送、接收数据 write(fd);send(fd),read(fd);recv(fd);
  • 四次挥手断开连接,可以由任意方发起close(fd);shutdown(fd)

客户端:

  • 创建套接字文件skfd = socket()
  • 主动向服务器发起链接请求,三次握手OK后即链接成功 connet(skfs..)
  • 客户端向服务器发送数据 write(skfd);send(skfd)
  • 客户端接收服务器数据 read(skfd);recv(skfd)
  • 四次挥手断开链接,可以由任意方发起close(fd);shutdown(fd)

以上流程中可以看到服务器在与客户端通信过程中的收发数据使用的是新的文件描述符fd,而客户端收发数据使用的是创建socket时的描述符skfd,这里服务器是需要支持多客户端链接;即每个客户端与服务器进行链接后服务器都会创建一个新的文件描述符fd,用于单独和该客户端进行通信。

更多相关:

  • 滑块式验证码用户通过拖动滑块行为来完成校验,支持PC端及移动端。可以将用户拖动行为的时间、精度,滑动轨迹等信息到服务器,然后进行后台算法验证。特别介绍Blazor 版本的滑块验证码 传送门在线演示效果图快速开始组件依赖 font-awesomeCSS将引入样式表的 标签复制并粘贴到 中,并放在所有其他样式表之前。JS将引入脚本的 用...

  • Ktor 是一个使用 Kotlin 以最小的成本快速创建 Web 应用程序的框架。Ktor 是一个用于在连接系统(connected systems)中构建异步服务器和客户端的 Kotlin 框架。它由 Kotlin 团队创建,因此,它充分利用了 Kotlin 的语言特性,为开发者提供出色的体验和运行时性能。import io.kto...

  • l VDI (Virtual Desktop Infrastructure)VDI构架采用的“集中存储、集中运算”构架,所有的桌面以虚拟机的方式运行在服务器硬件的虚拟化层上,桌面以图像传输的方式发送到客户端。l IDV (Intelligent Desktop Virtualization) 由于VDI方案对服务器资源、网络带宽要求比...

  • 受昨晚闰秒问题影响,今天内网和线上的ATS服务器都出现了CPU负载增高的问题,参见下面的截图 下面是tsar监控到负载异常记录,从今天(20150701)早上8:05分开始: 我们内网和线上的服务器Linux kernel内核版本都是 经过实践摸索,发现如下规律: 1.如果已经开启ntpd,如果昨晚没有关闭n...

  • 下面的安装假定是以root用户身份进行的,Linux服务器已经安装好系统,磁盘已经做好分区。 首先需要认识我们的Linux服务器的硬件配置和软件情况 硬件配置: DELL R720 2U服务器 CPU  8核 Intel(R) Xeon(R) CPU E5-2609 0 @ 2.40GHz 内存 32G 硬盘  系统盘 /...

  • 文章目录前言函数描述代码实例如何得到客户端的IP 和 端口号 前言 当使用tcp服务器使用socket创建通信文件描述符,bind绑定了文件描述符,服务器ip和端口号,listen将服务器端的主动描述符转为被动描述符进行监听之后,接口accept通过三次握手与客户端建立连接 TCP 编程模型如下: 函数描述 #i...

  • fifo的双向通信的方式如下图: 两个进程间的通信需要两个命名管道,分别处理一个进程的读和写 导致这种通信方式出现的根因还是由于fifo的阻塞读和阻塞写,所以这里需要使用两个管道对读写进行分别处理。 同时因为管道传输的数据为流式数据,则无法对数据进行指定标记(数据的发送者,接受者,大小。。。)。 SERVER端代码如下: /*...

  • 文章目录介绍重定向函数介绍总结 linux terminal输入如下命令,其中"|"符号即为我们上文中所说的无名管道 介绍 正如我们上文中所描述的"|“无名管道提供了具有亲缘关系的进程之间的通信,它由于直接使用系统调用,运行效率较高。则linux系统下可以大批量的使用”|"来提供命令直接输入输出的重定向。 具体sh...

  • 2019独角兽企业重金招聘Python工程师标准>>> fd_set 结构,是一个数字。 文件描述符fd的值 不能超过1024,而不是数量不能超过1024。 在开发打开句柄多的程序时,最好不要使用select。否则就使用多进程开发。 /usr/include/X11 Xpoll.h 文件 #ifndef _XPOLL_H_#...