首页 > 系统相关 >linux TCP 通信流程 套接字函数

linux TCP 通信流程 套接字函数

时间:2023-10-12 12:33:51浏览次数:59  
标签:int TCP 描述符 linux sockfd 接字 连接 客户端

TCP 和 UDP   ->  传输层的协议

  UDP: 用户数据报协议,面向无连接,可以单播,多播,广播,面向数据报(类似战争中无线电的广播),不可靠。

  TCP: 传输控制协议,面向连接的,可靠的,基于字节流,仅支持单播传输(点对点)。

              UDP              TCP  

  是否创建连接      无连接              面向连接

  是否可靠        不可靠              可靠的

  连接的对象个数     一对一/多、多对一/多      支持一对一

  传输的方式       面向数据报          面向字节流

  首部开销        8个字节             最少20个字节 ~ 60字节

  适用场景        实时应用(视频会议、直播)       可靠性高的应用(文件传输)

TCP通信流程:

服务器端(被动接受连接的角色):

  1. 创建一个用于监听的套接字(fd)
    - 监听:监听有客户端的连接
    - 套接字:一个文件描述符
  2. 将这个监听的 文件描述符 和 本地的IP 和 端口 绑定(IP 和 端口 就是服务器的地址信息)
    - 客户端连接服务器的时候,使用的就是这个 IP 和 端口
  3. 设置监听,监听的 fd 开始工作
  4. 阻塞等待,当有客户端发起连接,解除阻塞,接受客户端的连接,会得到一个和客户端通信的套接字(fd)
  5. 通信
      - 接收数据
      - 发送数据
  6. 通信结束,断开连接

客户端:

  1. 创建一个用于通信的套接字(fd)
  2. 连接服务器,需要指定连接的服务器的 IP 和 端口
  3. 连接成功了,客户端可以直接和服务器通信
      - 接收数据
      - 发送数据
  4. 通信结束,断开连接

套接字函数:

 1 #include <sys/types.h>
 2 #include <sys/socket.h>
 3 #include <arpa/inet.h>   //包含了这个头文件, 上面两个就可以省略
 4 
 5 int socket(int domain, int type, int protocol);
 6     - 功能: 创建一个套接字
 7     - 参数:
 8         - domain: 协议族
 9             AF_INET: IPv4
10             AF_INET6: IPv6
11             AF_UNIX,AF_LOCAL: 本地套接字(进程通信)
12         - type: 通信过程中使用的协议类型
13             SOCK_STREAM: 流式协议
14             SOCK_DGRAM: 报式协议
15         - protocol: 具体的协议,一般写 0
16             - SOCK_STREAM: 流式协议默认使用TCP
17             - SOCK_DGRAM:  报式协议默认使用UDP
18         - 返回值:
19             - 成功: 返回文件描述符, 操作的就是内核缓冲区
20             - 失败: -1
21 
22 int bind(int sockfd, const struct  sockaddr * addr, socklen_t addrlen);//socket命名
23     - 功能: 绑定,将fd和 本地的IP +端口 进行绑定
24     - 参数:
25         - sockfd: 通过socket函数得到的文件描述符
26         - addr: 需要绑定的socket地址, 这个地址封装了ip和端口号信息
27         - addrlen: 第二个参数结构体占的内存大小
28 
29 int listen(int sockfd, int backlog);//两个队列 未连接 和 已经连接  cat /proc/sys/net/core/somaxconn: 4096
30     - 功能: 监听这个socket上的连接
31     - 参数: 
32         - sockfd: 通过 socket()函数得到的文件描述符
33         - backlog: 未连接 和 已经连接 的和的最大值  一般指定为5 or 128  小于4096
34 
35 int accept(int sockfd, struct sockaddr * addr, socklen_t *addrlen);
36     - 功能: 接收客户端连接, 默认是一个阻塞的函数, 阻塞等待客户端的连接
37     - 参数:
38         - sockfd: 用于监听的文件描述符
39         - addr: 传出参数, 记录了连接成功后客户端的地址信息(IP, port)
40         - addrlen: 指定第二个参数的对应的内存大小
41     - 返回值:
42         - 成功: 用于通信的文件描述符
43         - 失败: -1
44 
45 int connect(int sockfd, const struct  sockaddr *addr, socklen_t addrlen);
46     - 功能: 客户端连接服务器
47     - 参数: 
48         - sockfd: 用于通信的文件描述符
49         - addr: 客户端要连接的服务器的地址信息
50         - addrlen: 第二个参数的内存大小
51     - 返回值:
52         - 成功: 0
53         - 失败: -1    
54 
55 ssize_t write(int fd, const void *buf, size_t count);   //写数据
56 ssize_t read(int fd, void *buf, size_t count);          //读数据

 

标签:int,TCP,描述符,linux,sockfd,接字,连接,客户端
From: https://www.cnblogs.com/gpf1997/p/17759230.html

相关文章

  • Linux快捷键及History用法
    Linux快捷键及History用法1.bash的快捷键Ctrl+l清屏,相当于clear命令Ctrl+o执行当前命令,并重新显示本命令Ctrl+s阻止屏幕输出,锁定Ctrl+q允许屏幕输出,解锁Ctrl+c终止命令Ctrl+z挂起命令Ctrl+a光标移到命令行首,相当于HomeCtrl+e光标移到命令......
  • Linux 中awk命令根据索引文件批量提取列和行
     001、批量提取列,根据索引index.txt文件批量提取2、4、8、9列[root@pc1test2]#lsa.txtindex.txt[root@pc1test2]#cata.txt##测试文件00100200300400500600700800901001101201301401501601701801902002102202302402502602......
  • 面试被问 Linux 命令 su 和 sudo 的区别
    之前一直对 su 和 sudo 这两个命令犯迷糊,最近专门搜了这方面的资料,总算是把两者的关系以及用法搞清楚了,这篇文章来系统总结一下。1、准备工作因为本篇博客中涉及到用户切换,所以我需要提前准备好几个测试用户,方便后续切换。Linux中新建用户的命令是 useradd ,一般系统中这个命......
  • 太厉害了,终于有人能把TCP/IP协议讲的明明白白了
    一图看完本文1、计算机网络体系结构分层计算机网络体系结构分层计算机网络体系结构分层不难看出,TCP/IP与OSI在分层模块上稍有区别。OSI参考模型注重“通信协议必要的功能是什么”,而TCP/IP则更强调“在计算机上实现协议应该开发哪种程序”。2、TCP/IP基础1.TCP/IP的具体含......
  • kali linux 设置固定IP
    1.修改文件/etc/network/interfaces┌──(kali㉿kali)-[~]└─$sudovi/etc/network/interfaces#Thisfiledescribesthenetworkinterfacesavailableonyoursystem#andhowtoactivatethem.Formoreinformation,seeinterfaces(5).source/etc/network/in......
  • linux系统和windows系统检测磁盘大小报警
    1.应用场景需要往磁盘中存储图片和或者数据,需要检测磁盘大小,当小于5GB的时候提示用户,并停止存储图片和数据,避免磁盘塞满,无法启动系统或者操作电脑;2.实现方法用一个定时器去定时查询磁盘空间大小,linux系统,采用QProess执行命令,然后解析命令返回值,获取剩余的磁盘空间voidFaceM......
  • 小干货~ NFS在Linux系统中的应用
    Linux系统中的经典的语句”一切皆文件”,意思就是说在Linux系统中,我们要达成任何目标,都是通过配置文件去实现的。既然这样,那我们就少不了跟文件打交道,今天就跟大家分享下如何在Linux系统中配置网络文件系统(NetworkFileSystem,NFS)服务来达到Linux系统之间的文件共享的目的。......
  • ulimit命令-限制linux内核的资源大小-(用户级,系统级2种限制)
    ulimit命令-限制linux内核的资源大小ulimit-n查看linux系统的最大文件打开数设置最大文件打开数的大小:临时设置:ulimit-SHn 65535-S表示软限制-H表示硬限制永久生效:文件:/etc/security/limits.conf添加2行:*  soft nofile65535* hard  nofile65535上面的*......
  • [扫盲]在linux上查询gpu占用
    参考资料:how-to-measure-gpu-usage按显卡厂家来区分:NvidiaGPU:nvidia-smi或者gpustatIntelGPU:intel-gpu-toolsAmdGPU:aticonfig--odgc--odgt......
  • linux 中 awk直接引入外部变量
     001、[root@pc1test1]#lsa.txt[root@pc1test1]#a=4[root@pc1test1]#cata.txt1[root@pc1test1]#awk'{for(i=1;i<="'$a'";i++)print"xx"}'a.txtxxxxxxxx 。 ......