TCP/UDP 编程模型

TCP编程模型

TCP/UDP 编程模型
  1. server创建socket套接字
  2. socket套接字–可以理解为文件描述符(file descriptor),UNIX把网络看成文件
/**
 * @param domain domain参数指定了一个通信域;它选择了将被用于通信的协议族。 比如 AF_UNIX AF_INET
 * @param type type of sockfd 通信协议
 *              SOCK_STREAM : 数据流协议    TCP协议
 *              SOCK_DGRAM  : 数据报协议    UDP协议
 * @param protocol 特殊通信类型 一般指定为0
 * @return On success, a file descriptor for the new socket is returned.

 *         On error, -1 is returned, and errno is set appropriately.

 */
int socket(int domain, int type, int protocol);
2. bind 绑定指定的IP 和 Port端口
~~~c
typedef unsigned int socklen_t ;
int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
/*
    bind 绑定的地址,必须是没有被注册过的
    On success, zero is returned.

    On error, -1 is returned, and errno is set appropriately.

*/
  1. listen

  2. 所谓监听服务,服务器可以 使 绑定的套接字变为被动模式 只能用于接收client的connect 请求

  3. *不能用于 read or write
int listen(int sockfd, int backlog);
// backlog 包括连接上的client和在连接的client 最大数量  如何大于这个数量,client会受到ECONNREFUSED;
  1. accept && connect

  2. 3次握手

Client doing Server closed closed SYN_SENT [SYN]Seq=n —> listen

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
  1. recv && send
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
  1. close
#include
int close(int fd);  // on success return zero,On error, -1 is returned and errno is set appropriately.

UDP编程模型

TCP/UDP 编程模型
  1. socket
  2. bind
  3. recvfrom && sendto
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
        struct sockaddr *src_addr, socklen_t *addrlen);
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
        const struct sockaddr *dest_addr, socklen_t addrlen);
  1. close

TCP与UDP的区别

TCP

  • Transmission Control Protocol 传输控制协议
  • 面向连接 (客户端需要调用connect进行连接,三次握手)
  • 可靠 数据传输保证数据的完整性和有序性 数据检验、超时自动重传、丢失重传、滑动窗口机制(保证数据收发一致)应答机制
    A B C D E —> ABCDE
  • 传输效率比较慢
  • 安全性要高

UDP

  • User Datagram Protocol 用户数据报文协议
  • 不连接 (客户端和服务器不会建立连接)
  • 不可靠 数据传输可能导致数据丢失 接收到的数据顺序和发送数据的顺序可能不一致
    A B C —> C A
  • 传输效率比较高
  • 安全性比较低

TCP UDP Transmission Control Protocol 传输控制协议 User Datagram Protocol 用户数据报文协议 面向连接(三次握手四次分手) 无连接 可靠、安全、保证数据有序 不可靠、不安全、数据可能丢失、顺序不确定 延时重传、丢失重传、应答、检验、滑动窗口 没有重传、没有检验、没有应答 复杂、传输效率稍低 简单、高效、传输速度快 适合场合:安全性高、数据量少 适合场景:视频传输、数据量大的情况、对数据安全性要求不高 SOCK_STREAM SOCK_DGRAM socket/bind/listen/accept/recv/send/connect/close socket/bind/recvfrom/sendto/close

Original: https://www.cnblogs.com/FlyingDoG–BoxPiG/p/16689498.html
Author: 打工搬砖日记
Title: TCP/UDP 编程模型

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/574036/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • JavaScript json&ajax

    本博客所有文章仅用于学习、研究和交流目的,欢迎非商业性质转载。 博主的文章没有高度、深度和广度,只是凑字数。由于博主的水平不高,不足和错误之处在所难免,希望大家能够批评指出。 博主…

    Linux 2023年6月13日
    097
  • SQL44 将id=5以及emp_no=10001的行数据替换成id=5以及emp_no=10005

    本题链接表结构如下所示。 +—-+——–+—————–+————+————+ | id | emp_no | t…

    Linux 2023年6月13日
    0106
  • 如何优雅的处理 accept 出现 EMFILE 的问题

    通常情况下,服务端调用 accept 函数会返回一个新的文件描述符,用于和客户端之间的数据传输 在服务器的开发中,有时会遇到这种情况:当调用 accept 函数接受客户端连接,函数…

    Linux 2023年6月13日
    095
  • 数据结构-树

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Linux 2023年6月11日
    0115
  • 浪剑天下H5游戏详细图文架设教程

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Linux 2023年6月7日
    096
  • 性能测试—性能监控

    性能测试中,首先需要确定需求 测什么?怎么测?达到什么标准?。确定好性能测试的需要之后选择性能测试工具,jmeter或者LoadRunner。 分析是否需要分布式压测,如果需要分布…

    Linux 2023年6月8日
    083
  • Docker安装使用及私有仓库搭建

    1 概念 1.1 基本概念 Docker daemon​ 守护进程,运行在宿主机上,用户通过DockerClient客户端Docker命令与Docker daemon交互。Dock…

    Linux 2023年5月27日
    098
  • 使用SpringBoot校验客户端传来的数据

    前端的数据校验都是辣鸡!后端天下第一! 如果想完美地贯彻原则, 理论上来说就应该让前端那边少传数据过来, 有些的东西能查的就自己查出来。 常用的数据校验like this: /**…

    Linux 2023年6月14日
    079
  • shell运算符

    算术运算符 下表列出了常用的算术运算符,假定变量 a 为 10,变量 b 为 20: 运算符说明举例 + 加法 expr $a + $b 结果为 30。 – 减法 ex…

    Linux 2023年5月27日
    077
  • rsync

    rsync简介 rsync是linux系统下的数据镜像备份工具。使用快速增量备份工具Remote Sync可以远程同步,支持本地复制,或者与其他SSH、rsync主机同步。 rsy…

    Linux 2023年6月6日
    088
  • beego 的打包问题

    使用BeeGo2.0 编译后 打包上传到服务器出现运行时问题。在app.conf配置文件开发环境改为生产环境就行了 runmode = prod Original: https:/…

    Linux 2023年6月13日
    095
  • Centos7.9编译OpenSSH的rpm安装包并升级OpenSSH

    本文介绍如何通过openssh-9.0p1.tar.gz制作openssh的rpm安装包,并升级openssh到9.0。 下载openssh-9.0p1.tar.gz 编译成rpm…

    Linux 2023年6月7日
    0112
  • 【Example】C++ 接口概念讲解及例子演示

    C++ 和 Java 不同的是,C++ 没有 interface 关键字。对于很多新手来说,C++ 当中接口的概念不容易像 Java 当中那样被理解。 然而接口是面向对象编程当中的…

    Linux 2023年6月13日
    094
  • 关于HandlerInterceptorAdapter和WebMvcConfigurerAdapter过时

    修改成这样 @Configuration public class HeaderTokenInterceptor implements WebMvcConfigurer { @Au…

    Linux 2023年6月8日
    0101
  • MacOS设置终端代理

    前言 国内的开发者或多或少都会因为网络而烦恼,因为一些特殊原因有时候网络不好的时候需要使用代理才能完成对应的操作。原来我一直都是使用斐讯路由器然后刷了梅林的固件,直接在路由器层面设…

    Linux 2023年6月14日
    097
  • 【Example】C++ Vector 内存预分配的良好习惯

    为什么要对 Vector 进行内存预分配? 1,Vector 本身是一个内存只会增长不会减小的容器。 2,Vector 存在 size 和 capacity 两种计数,size 即…

    Linux 2023年6月13日
    0107
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球