首页 > 系统相关 >【转】第一篇-linux中socket通信

【转】第一篇-linux中socket通信

时间:2023-10-16 10:00:46浏览次数:40  
标签:socket 第一篇 通信 linux 请求 连接 服务端 客户端

 

转, 原文:https://zhuanlan.zhihu.com/p/628583834

----------------

 

客户端和服务端是如何通信的

在linux中客户端和服务端通信的流程如图所示:

流程分析:
服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。在这时如果有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束。

TCP服务端通过依次调用 socket(),bind(),listen()之后,就会监听指定的socket地址了。客户端如果调用connect()发出一个 连接请求,服务端监听到这个 连接请求之后,就会调用accept()函数去接受请求,这样连接就建立好了,之后就可以进行网络IO操作了。

连接是如何建立的

前面我们讲的,客户端调用connect()发起连接请求,服务端监听到这个连接请求,就会调用accept()接受请求,这个流程是两者建立连接的流程,这个连接建立的流程就是三次握手协议。

  1. 当客户端调用connect()时,触发了连接请求,向服务器发送了syn包,这时客户端会进入阻塞状态;
  2. 服务端监听到连接请求,即收到了syn包,调用accept函数接受请求向客户端发送syn&ack,这时服务端也会进入阻塞状态;
  3. 客户端收到收到服务器的syn&ack包,connect()会返回给服务端ack;
  4. 服务端收到ack之后,accept()方法会返回(即执行结束)

思考:客户端和服务端具体socket是如何进行通信的?(我也不知道这样描述对不对)
假设服务端已经创建一个socket,用于监听客户端的连接请求。现在有两个客户端socket A和B尝试连接到服务端。

  1. 客户端socket A向服务端发送连接请求
  2. 服务端使用accept函数接受客户端socket A的连接请求,并为其创建一个新的socket socketA,该新的socket将用于与客户端socket A进行通信。
  3. 客户端socket B也向服务端发送连接请求
  4. 服务端使用accept函数同样接受客户端socket B的连接请求,并为其创建一个新的socket socketB,该新的socket将用于与客户端socket B进行通信。

此时,服务端就有了两个新的socket:socketA用于与客户端socket A进行通信,socketB用于与客户端socket B进行通信。这两个socket是独立的,互不干扰。每个socket都可以单独处理某个客户端的请求和数据传输。这样,服务端就可以同时处理多个客户端的请求和数据传输,提高了并发性能和效率。
需要注意的是,服务端通过这些socket与不同的客户端进行通信,服务端原始的socket只用于监听客户端的连接请求,而不用于实际的数据传输,因此它可以同时处理多个客户端的连接请求。而新创建的每个socket则对应一个独立的客户端,并且每个socket只能用于与对应的客户端进行通信。
ps:这里再啰嗦一句,服务端原始socket只用于建立连接,数据传输由新的socket去做。

思考:我们前面学习了客户端和服务端如何进行通信,但是我们发现一个问题,就是那种通信方式只适用于一个客户端和一个服务端进行通行,如果我们想多个客户端和一个服务端通信,要怎么做呢?这里就引出了网络IO通信模型


参考文章:

Linux的SOCKET编程详解_linux socket_hguisu的博客-CSDN博客

标签:socket,第一篇,通信,linux,请求,连接,服务端,客户端
From: https://www.cnblogs.com/oxspirt/p/17766733.html

相关文章

  • Avalonia 实现视频聊天、远程桌面(源码,支持Windows、Linux、国产OS)
        现在最火的.NET跨平台UI框架莫过于Avalonia了。Avalonia基于.NETCore,因此它可以运行在任何支持.NETCore的平台上。之前基于CPF跨平台UI框架写过一个视频聊天的demo,而现在看来Avalonia是大势所趋,于是,我再写一个Avalonia版本的Demo来供大家参考,它可以在Windows和Linux......
  • Linux ls 查看目录结构与文档信息
    摘要:Linuxls命令用于列出目标目录中所有的子目录和文件,发掘并掌握ls命令及其参数设置可以驾轻就熟地管理文件,随心所欲地浏览并确定所在的位置!ls命令介绍  今天,楼兰胡杨继续跟各位猿友一起零基础学习Linux相关指令——ls,它是一条Linux必备命令。发掘并掌握ls命令常用功能,可以......
  • 14.6 Socket 应用结构体传输
    当在套接字编程中传输结构体时,可以将结构体序列化为字符串(即把结构体的所有成员打包成一个字符串),然后将字符串通过套接字传输到对端,接收方可以将字符串解析为结构体,然后使用其中的成员数据。这种方法通常被称为序列化(Serialization)和反序列化(Deserialization),本章中我们可以采用将......
  • 14.7 Socket 循环结构体传输
    在上述内容中笔者通过一个简单的案例给大家介绍了在套接字编程中如何传递结构体数据,本章将继续延申结构体传输,在某些时候例如我们需要传输一些当前系统的进程列表信息,或者是当前主机中的目录文件,此时就需要使用循环结构体传输功能,循环传输结构体的关键点在于,客户端发送结构体数据......
  • TUXEDO宣布Nano Pro Gen12迷你Linux PC搭载AMD Ryzen 7000U处理器
    导读这款迷你PC还配备了AMDMediatekWi-Fi6E三频带芯片,为坚定的AMD粉丝提供了更多选择。TUXEDOComputers今天宣布了NanoPro迷你PC的第12代(Gen12),内部配置升级,连接性改进,计算效率提高。与2021年11月宣布的NanoProGen11相比,NanoProGen12迷你电脑拥有更强大、更高效......
  • Linux服务器网络配置
    Linux服务器网络配置记录材料准备材料数量服务器1显示器1网线2(千兆*1)千兆交换机1插线板1网线连接从路由器LAN口引出网线到交换机任一口,再从交换机剩余任一口引出千兆网线到服务器网线插口1服务器网线插口1插入后有有灯闪烁代表网线连接正常网......
  • 第7周Linux课堂总结
       这一周的Linux课程我们学习了文件权限,权限的意义在于允许某一个用户或某个用户组以规定的方式去访问某个文件。首先我们学习了基本权限UGO,U:owner,属主,G:group,属组,O:other,其他用户,Linux系统通过U、G、O将用户分为三类,并对这三类用户分别设置三种基本权限,这种设置权限的方式称......
  • 安装Linux系统对硬件的要求
    很多初学者在安装Linux系统时,都对自己的电脑配置存在质疑,担心其是否能够满足安装Linux的要求。本节就从CPU、内存、硬盘、显卡等这些方面,详细介绍一下安装Linux系统的最低配置。基于硬件的快速发展以及操作系统核心功能的增加,势必将淘汰掉一批老旧的电脑,它们已经没有能力负......
  • 初识Linux
        学好该内容你需要了解云计算的概念、了解虚拟机的安装以及熟悉Linux操作系统。   说到云计算就需要知道的是云计算最初就是为了应对互联网行业高速发展所带来的网络、服务器、存储、应用软件及服务的昂贵价格而出现的“替代品”,现已快成为互联网公司的第一选择。......
  • Linux第11章学习笔记
    第十一章学习笔记##EXT2文件系统多年来,Linux一直使用EXT2作为默认文件系统EXT3是EXT2的拓展。EXT3中增加的主要内容是一个日志文件EXT4的主要变化是磁盘块的分配EXT2文件系统数据结构通过mkfs创建虚拟磁盘创建了一个带有nblocks个块(每个块大小blksize字节)和ninodes个索引......