linux高级编程(TCP)(传输控制协议)

TCP与UDP:

TCP:

TCP优点:

       可靠,稳定 TCP的可靠体现在TCP在传递数据之前,会有三次握手来建立连接,而且在数据传递时,有确认、窗口、重传、拥塞控制机制,在数据传完后,还会断开连接用来节约系统资源。 

TCP缺点:

      因为TCP的繁琐机制,造成了TCP会更慢,消耗更多资源,效率会比较低,

UDP:

UDP优点:

      因为没有TCP这么繁琐的机制,即一个无状态的传输协议,所以UDP的传输速度回非常快

UDP缺点:

      不可靠,不稳定,网速不好容易丢包

TCP

C/S 模式  --> 服务器/客户端模型(client/server)

server:socket()-->bind()--->listen()-->accept()-->recv()-->close() 
           创建套接字-->关联接口地址-->等待连接-->提取连接-->收、发-->关闭
client:socket()-->connect()-->send()-->close();
            创建套接字-->连接-->收、发-->关闭

三次握手/四次挥手(建立/关闭连接):

三次握手:

    两个标志:SYN(同步序列编号)标志  ACK(确认)标志
    客户端:connect函数      服务器:accept函数

    第一次握手:客户端发SYN,表示希望建立连接,客户端进入SYN_SENT状态    
    第二次握手:服务端收到后回发SYN-ACK,服务端进入SYN_RECEIVED状态
    第三次握手:客户端收到SYN-ACK,回发ACK确认,双方进入ESTABLISHED状态

    客户端请求 --> 服务端收到请求,通知客户端 --> 客户端确认,握手结束,双方建立连接

四次挥手:

    FIN:结束标志
    看谁先发close函数,就是谁发起第一次握手

    第一次挥手:客户端发FIN,并进入FIN_WAIT_1状态
    第二次挥手:服务器收到后,发送ACK给客户端并进入CLOSE_WAIT
    第三次挥手:客户端完成所有数据接收后,准备关闭连接,发送FIN,TIME_WAIT状态
    第四次挥手:服务器收到FIN后发送ACK,并关闭所有连接

   客户端请求 --> 服务器收到请求,通知客户端 
    --> 接收完所有数据后,通知服务器关闭连接 --> 服务器收到请求后关闭连接

注:

按照数据本身发送顺序放入缓冲区中
(但是数据本身没有边界,会出现黏包问题)

解决:1.加入结束标志(发送strlen(buf)+1个数据)(字符串)
          2.固定大小(发的少,10,或者结构体)
          3.自定义协议(开始结束标志,长度)

socket()

int socket(int domain, int type, int protocol);
功能:程序向内核提出创建一个基于内存的套接字描述符

参数:domain  地址族,PF_INET(协议族) == AF_INET(地址族,IPv4) ==>互联网程序
                      PF_UNIX == AF_UNIX ==>单机程序
      type    套接字类型:
                SOCK_STREAM  流式套接字 ===》TCP   
              SOCK_DGRAM   用户数据报套接字===>UDP
              SOCK_RAW     原始套接字  ===》IP
      protocol 协议 --> 0 表示自动适应应用层协议。

返回值:成功 返回申请的套接字id
              失败  -1;

bind()

int bind(int sockfd, struct sockaddr *my_addr, 
             socklen_t addrlen);
功能:如果该函数在服务器端调用,则表示将参数1相关
      的文件描述符文件与参数2 指定的接口地址关联,
      用于从该接口接受数据。

      如果该函数在客户端调用,则表示要将数据从
      参数1所在的描述符中取出并从参数2所在的接口
      设备上发送出去。

      注意:如果是客户端,则该函数可以省略,由默认
            接口发送数据。
参数:sockfd 之前通过socket函数创建的文件描述符,套接字id
      my_addr 是物理接口的结构体指针。表示该接口的信息。

      struct sockaddr      通用地址结构
      {
          u_short sa_family;  地址族
          char sa_data[14];   地址信息
      };

      转换成网络地址结构如下:
      struct _sockaddr_in    ///网络地址结构
      {
          u_short           sin_family; 地址族
          u_short           sin_port;   ///地址端口
          struct in_addr  sin_addr;   ///地址IP
          char               sin_zero[8]; 占位
      };

      struct in_addr
      {
          in_addr_t s_addr;
      }

      socklen_t addrlen: 参数2 的长度。
返回值:成功  0
             失败  -1;

listen()

 int listen(int sockfd, int backlog);  
    功能:在参数1所在的套接字id上监听等待链接。(把套接字变为监听状态)
    参数:sockfd  套接字id
          backlog 允许链接的个数。(三次握手的排队数)
    返回值:成功  0
            失败  -1;

accept()

 功能:从已经监听到的队列中取出有效的客户端链接并
            接入到当前程序。
   参数:sockfd 套接字id
            addr  如果该值为NULL ,表示不论客户端是谁都接入。
                如果要获取客户端信息,则事先定义变量
               并传入变量地址,函数执行完毕将会将客户端
               信息存储到该变量中。
         addrlen: 参数2的长度,如果参数2为NULL,则该值
                     也为NULL;
                 如果参数不是NULL,&len;
                  一定要写成len = sizeof(struct sockaddr);
   返回值:成功 返回一个用于通信的新套接字id;
                从该代码之后所有通信都基于该id

           失败  -1;

在connect函数的最后一个参数是socklen_t类型,

而在accept函数中最后一个参数是socklen_t *类型

一般在第一次调用socket时取名listenfd(只用到listen,到该函数时被替换)

typedef struct inetaddr *(SA);
int listenfd = socket(AF_INET,SOCK_STREAM,0);  //第一个创建的套接字文件描述符
int conn = connect(listenfd,(SA)&cli,len);  //connect创建的新描述符

recv()

ssize_t recv(int sockfd, void *buf, size_t len,
             int flags);
功能:从指定的sockfd套接字中以flags方式获取长度
      为len字节的数据到指定的buff内存中。
参数:sockfd  
        如果服务器则是accept的返回值的新fd
        如果客户端则是socket的返回值旧fd
      buff 用来存储数据的本地内存,一般是数组或者
      动态内存(可以是结构体,连续的一段内存即可)。
      len 要获取的数据长度
      flags 获取数据的方式,0 表示阻塞接受。

返回值:成功 表示接受的数据长度,一般小于等于len
        失败  -1;

send()

int send(int sockfd, const void *msg, 
        size_t len, int flags);
   功能:从msg所在的内存中获取长度为len的数据以flags
            方式写入到sockfd对应的套接字中。

   参数:sockfd(用自己的套接字描述符即可,send和recv都一样)

         msg 要发送的消息
         len 要发送的消息长度
         flags 消息的发送方式。

  返回值:成功  发送的字符长度
            失败  -1;

close

close()  ===>关闭指定的套接字id;

客户端:

socket,connect,send,close

connect()

int connect(int sockfd, const struct sockaddr *addr,
                  socklen_t addrlen);
   功能:该函数固定有客户端使用,表示从当前主机向目标
            主机发起链接请求。
   参数:sockfd 本地socket创建的套接子id
            addr 远程目标主机的地址信息。
         addrlen: 参数2的长度。
   返回值:成功 0
                 失败 -1;

    在connect函数的最后一个参数是socklen_t类型,

    而在accept函数中最后一个参数是socklen_t *类型

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/43750.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小试牛刀--对称矩阵压缩存储

学习贺利坚老师对称矩阵压缩存储 数据结构实践——压缩存储的对称矩阵的运算_计算压缩存储对称矩阵 a 与向量 b 的乘积-CSDN博客 本人解析博客 矩阵存储和特殊矩阵的压缩存储_n阶对称矩阵压缩-CSDN博客 版本更新日志 V1.0: 对老师代码进行模仿 , 我进行名字优化, 思路代码注释 …

【正点原子i.MX93开发板试用连载体验】AI程序的验证

本文最早发表于电子发烧友论坛:【新提醒】【正点原子i.MX93开发板试用连载体验】基于深度学习的语音本地控制 - 正点原子学习小组 - 电子技术论坛 - 广受欢迎的专业电子论坛! (elecfans.com) 这次的主要目标就是学习NXP的AI程序开发。首先阅读了《05【正点原子】ATK…

扩展任务1:完成页面的布局设计和美化

任务指导 1、参照下图,完成页面的布局和美化设计: 2、实现思路 例如可以通过修改Style样式的方式完成布局调整,具体页面显示样式,需要学生根据自己的喜好和设计自行完成,建议每个学生的页面尽量个性化设计&#xff0…

锅总反驳李彦宏说的“不要卷模型,要卷应用”

李彦宏的观点是大家不要卷模型,要卷应用,但我认为这种看法是荒谬的。以下是24条反驳李彦宏观点的论点和论据: 模型的准确性直接决定应用的质量和用户体验: 论据:在自然语言处理、计算机视觉等领域,模型的准…

【HTML入门】第六课 - 上标字、下标字和删除字

这一小节,我们说3个比较特殊的,用到的场景不多,但需要的时候绝对是有用处的。他们分别是上标字,下标字和删除字。 目录 1 上标字 2 下标字 3 删除字 4 学习HTML的一些问题 1 上标字 什么是上标字呢?你是否记得多少…

线程并发库复习

1.进行和线程 什么是进程:进程是内存分配的基本单位,它是程序执行时的一个实例,会被放到进程就绪队列,等进程调度器选择它,给它时间片,它才会运行。在java中启动进程,main,test&…

uniapp移动端实现商品拖拽集合,一行多个商品左滑删除功能!

许久未见,最近遇到一个产品,他是第一次做产品。总是有一些反人类的设计。没错,就是标题上的拖拽集合,以及商品的左滑删除。这种功能放眼各大app我都没找到有用这种设计的,他口口声声说他用过会找给我看,我等…

MySQL GROUP_CONCAT 函数详解与实战应用

提示:在需要将多个值组合成一个列表时,GROUP_CONCAT() 函数为 MySQL 提供了一种强大的方式来处理数据 文章目录 前言什么是 GROUP_CONCAT()基本语法 示例使用 GROUP_CONCAT()去除重复值排序结果 前言 提示:这里可以添加本文要记录的大概内容…

16:9横屏短视频素材库有哪些?横屏短视频素材网站分享

在这个视觉内容至关重要的时代,16:9横屏视频因其宽广的画面和优越的观赏体验,已经成为无数创作者和营销专家的首选格式。但要创造出吸引人的横屏视频,高质量的视频素材库是不可或缺的。不管你是资深视频制作人还是刚入行的新手,下…

02day-C++学习(const 指针与引用的关系 inline nullptr)

02day-C学习 1. 使用const注意事项 注意事项 • 可以引⽤⼀个const对象,但是必须⽤const引⽤。const引⽤也可以引⽤普通对象,因为对象的访 问权限在引⽤过程中可以缩⼩,但是不能放⼤。 • 不需要注意的是类似 int& rb a3; double d 1…

SVM - 径向基函数核 Radial Basis Function Kernel,简称RBF核或者高斯核

SVM - 径向基函数核 Radial Basis Function Kernel,简称RBF核或者高斯核 flyfish 径向基函数核(Radial Basis Function Kernel,简称RBF核),也称为高斯核,是一种常用的核函数,用于支持向量机&a…

2025考研~数据结构试卷

作者主页:知孤云出岫 数据结构试题 [TOC](数据结构试题)数据结构试卷一、选择题(每题2分,共20分)二、填空题(每题3分,共15分)三、简答题(每题10分,共40分)四…

15.分频器设计--偶分频

设计一个六分频时钟信号 (1)visio视图: (2)Verilog代码: module divider_six(clk,reset_n,clk_out);input clk;input reset_n;output reg clk_out;reg [1:0]cnt;//计数器模块设计 always(posedge clk o…

突破传统,实时语音技术的革命。Livekit 开源代理框架来袭

🚀 突破传统,实时语音技术的革命!Livekit 开源代理框架来袭! 在数字化时代,实时通信已成为我们日常生活的一部分。但你是否曾想象过,一个能够轻松处理音视频流的代理框架,会如何改变我们的沟通方式?今天,我们就来一探究竟! 🌟 什么是 Livekit 代理框架? Live…

大数据基础:Hadoop之HDFS重点架构原理

文章目录 Hadoop之HDFS重点架构原理 一、什么是Hadoop 二、HDFS简介 三、HDFS架构 3.1、NameNode 3.2、SecondaryNameNode 3.3、DataNode 3.4、Client 四、fsimage和editslog合并 五、Block副本放置策略 六、读写流程 6.1、HDFS写文件流程 6.2、HDFS读文件流程 Ha…

2024年7月1日,公布的OpenSSH的漏洞【CVE-2024-6387】

目录 ■概要 ■概要(日语) ■相关知识 openssh 和 ssh 有区别吗 如何查看 openssh的版本 漏洞描述 glibc Linux是什么 如何查看系统是不是基于 Gibc RHEL Linux 是基于Glibc的Linux吗 还有哪些 Linux版本是基于 GNU C库(glibc&…

JustAuth实现多个钉钉扫码登录

需求: 实现多个钉钉组织的用户绑定和扫码登录。 JustAuth框架实现钉钉扫码登录用到的dingTalk接口: https://oapi.dingtalk.com/connect/qrconnecthttps://oapi.dingtalk.com/connect/oauth2/sns_authorize根据sns临时授权码获取用户信息 https://oap…

Java基础之Stringjoiner

Stringjioiner的概述 StringJoiner跟StringBuilder一样,也可以看成是一个容器,创建之后里面的内容是可变的。作用:提高字符串的操作效率,而且代码编写特别简洁,但是目前市场上很少有人用。 Stringjoiner的构造方法 Stringjoiner…

软件许可证优化怎么做最好!

在当今数字化发展的浪潮中,软件许可证的优化成为了 IT 总监们面临的一项重要挑战。在许可数量受限的情况下,如何将现有许可发挥最大利用率,是一个亟待解决的问题。 信息采集是优化的基础。 我们需要采集关于软件使用频率、使用时长、用户部门…

05.C1W4.Machine Translation and Document Search

往期文章请点这里 目录 OverviewWhat you’ll be able to do!Learning Objectives Transforming word vectorsOverview of TranslationTransforming vectors Align word vectorsSolving for RFrobenius normFrobenius norm squaredGradient K nearest neighborsFinding the tr…