TCP+UDP通信

一、UDP协议 
1.1、recvfrom()

参数说明

int sockfd, //socket 的fd

void *buf, // 保存数据的一块空间的地址

size_t len, //这块空间的大小

int flags,// 0 默认的接收方式 -----阻塞方式 默认行为是阻塞

  • MSG_DONTWAIT 不阻塞方式,用他的话代表读的时候是非阻塞方式
  • 类似与读操作,如果没有东西就等待,一直等待
  • 如果我们把发送和接收放一块的话,读端没有发送,也会使我们写端阻塞到哪里,除非数据发送过来

struct sockaddr *src_addr,//用来保存发送方的地址信息,接收谁给发的

socklen_t *addrlen);表示发送方发送实际的地址信息大小

注意 要是不关心是谁,我们addrlen或者大小写NULL

我们先将值传递过去,他会将我们的真实的长度带出来,也就是说我们自己建立好一个他的地址信息的结构体

返回值

成功 返回接收到的字节数

失败 返回-1

注意点

  • inet_ntoa()将网络的字节序变成字符串类型
  • ntohs()  将网络的端口号转换成主机号的
  • 当一个socket创建之后它存在它存在了一个命名空间但是没有地址绑定,bind()就是给其进行绑定一个地址,相当于给一个套接字绑定了一进程的信息;绑定的IP是我们地址(服务器所在那台电脑的地址信息),socket 不绑系统会绑定
1.2、bind()绑定

服务器是需要绑定一下来进行操作

  int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);

功能:

如果该函数在服务器端调用,则表示将参数1相关的文件描述符文件与参数2指定的接口地址关联:用于从该接口接受数据。如果该函数在客户端调用,则表示要将数据从参数1所在的描述符中取出并从参数2所在的接口设备上发送出去。
注意:
如果是客户端,则该函数可以省略,由默认接口发送数据。

参数

  • sockfd 之前通过socket函数创建的文件描述符,
  • 套接字id my_addr 是物理接口的结构体指针。表示该接口的信息。

注意点

客户端可以绑定地址,但一般不绑定

  1. 为什么要给服务器绑定地址,因为初始的时候,如果服务器开始没有发信息,那么客户端就找不到,所以要绑定地址
  2. 绑定的是服务器端运行的地址
二、TCP

 

2.1、客户端

1、建立连接

socket //买了一部手机

bind // 可选 //插上sim卡

connect 发起连接 // 拨打电话

2、通信过程

read

write

close

2.2、服务器端

1、建立连接

socket // 买了一部手机

bind //插上sim卡

listen //监听 客户端的连接请求

accept //接听

2、通信过程

read

write

close

2.3、TCP连接建立

1、tcp三次握手(建立连接

客户端                                         服务器

-----我要和你连接--------------------->

<-------------------------------好的,可以建立连接

-----------好------------------------------>

2、tcp 四次挥手(断开连接) 

客户端                                             服务器

-----我要和你断开连接--------------------->

<-------------------------------好的,可以断开

<-------------------------------我也要断开-------

-----------好----------------------------------------->

 三、函数实现
3.1、connect()建立连接
#include <sys/types.h>          /* See NOTES */#include <sys/socket.h>int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);

功能:该函数固定有客户端使用,表示从当前主机向目标主机发起链接请求。
参数:

  • sockfd 本地socket创建的套接子
  • daddr 远程目标主机的地址信息,
  • addrlen:参数2的长度。

返回值:成功0       失败 -1

3.2、listen() 监听
#include <sys/types.h>          /* See NOTES */#include <sys/socket.h>int listen(int sockfd, int backlog);

功能:

反应监听那个套接字并且建立成功之后返回一个新的套接字

参数

  • 当前的套接字
  • 同时可以监听的个数

返回值

  • 正确 返回建立的新的套接字
  • 错误 返回 -1 

listen 会标记一下被动的socket(这个socket将会被用来接受到来的接受请求)

注意

其有两个socket

1、监听的socket

2、处理建立连接的socket(后续进行操作的socket)

3.3、listen工作原理图

 

四、编程时注意的点
  1. write的时候是有校字长的同时也要注意加'\0',否则读出来的时候会指针越界,我们没有给其添加结束标志
  2.  read和write读写的时候注意要是对应的buf

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

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

相关文章

使用dockerDesktop下载x86,amd64,arm64镜像

开启梯子 注意dockerDesktop不需要登录账号密码&#xff0c;不然拉取镜像会提醒账号或者密码错误 修改dockerDesktop配置&#xff0c;将experimental的值设置成 true&#xff0c;意思是&#xff1a;开启manifest实验特性 重启docker后下载镜像 –platform后面就是架构版本&a…

git服务器配置

git服务器http配置 1&#xff0c;配置apache服务器&#xff08;假定目录在gitFile&#xff09; 2&#xff0c;终端执行 cd ~/local/gitFile &#xff0a;定位至apache目录 mkdir myproject.git cd myproject.git git init --bare &#xff0a;创建仓库 完…

华为账号“一键登录”能力让美团用户尽享安全便捷的登录体验

背景 随着全场景智能生态的日益完善&#xff0c;用户面临着众多应用与服务的登录需求&#xff0c; 而繁琐的注册登录流程通常是用户转化的隐形障碍&#xff0c;用户可能因为步骤繁琐、记忆密码困难而中途放弃&#xff0c;导致应用错失潜在用户。其次&#xff0c;高门槛的登录方…

4.6算法之贪心_702:Crossing River

题目 702:Crossing River 总时间限制: 1000ms 内存限制: 65536kB 描述 A group of N people wishes to go across a river with only one boat, which can at most carry two persons. Therefore some sort of shuttle arrangement must be arranged in order to row the boat…

力扣223题详解:矩形面积的多种解法与模拟面试

在本篇文章中&#xff0c;我们将详细解读力扣第223题“矩形面积”。通过学习本篇文章&#xff0c;读者将掌握如何使用多种方法来解决这一问题&#xff0c;并了解相关的复杂度分析和模拟面试问答。每种方法都将配以详细的解释&#xff0c;以便于理解。 问题描述 力扣第223题“…

【C++】深入解析C/C++内存管理:new与delete的使用及原理

C语法相关知识点可以通过点击以下链接进行学习一起加油&#xff01;命名空间缺省参数与函数重载C相关特性类和对象-上篇类和对象-中篇类和对象-下篇日期类 本章将分享C为何放弃malloc/free系列&#xff0c;选择新系列new/delete去管理内存。深度探索new/delete的使用及其原理,m…

使用cbsd指令快速创建bhyve Ubuntu虚拟机实践

首先查看当前的模板 ls -la /usr/jails/etc/defaults/ 可以看到Ubuntu的20 22 23 24都有模板 ls /usr/jails/etc/defaults/vm-linux-ubuntuserver-amd64-2* /usr/jails/etc/defaults/vm-linux-ubuntuserver-amd64-20.conf /usr/jails/etc/defaults/vm-linux-ubuntuserver-a…

聚星文社——绘唐科技Ai推文软件

聚星文社——绘唐科技Ai推文软件 聚星文社--绘唐科技Ai推文软件https://iimenvrieak.feishu.cn/docx/ZhRNdEWT6oGdCwxdhOPcdds7nof AI推文软件是一种利用人工智能技术帮助用户自动生成推文内容的工具。 该软件会分析用户提供的相关信息和目标群体&#xff0c; 然后使用机器学习…

解决k8s分布式集群,子节点加入到主节点失败的问题

1.问题情况 Master主节点在 使用 kubeadm init 成功进行初始化后&#xff0c;如下所示 Your Kubernetes control-plane has initialized successfully!To start using your cluster, you need to run the following as a regular user:mkdir -p $HOME/.kubesudo cp -i /etc/k…

libevent之android与鸿蒙编译过程

背景 最近基于libevent开发了一个端侧的缓存代理库&#xff0c;先是基于macOS编译开发的&#xff0c;基本0问题&#xff0c;后来移植到鸿蒙与android时遇到一些编译链接问题。 libevent版本如下&#xff1a; 软件版本号libevent-2.1.8 android编译 编译环境 android studio…

信号和槽的第五个参数

在 Qt 中&#xff0c;connect 函数用于连接信号和槽。标准的 connect 函数有多个重载版本&#xff0c;其中一个版本包含五个参数。 第五个参数用于指定连接类型&#xff0c;即信号和槽的连接方式。以下是该函数的签名和参数说明&#xff1a; QMetaObject::Connection QObject…

【Python】FastAPI:快速上手

FastAPI 是一个现代的、快速的、高性能的 Python Web 框架&#xff0c;用于构建 API。它基于 Python 3.6 和标准的 ASGI&#xff08;Asynchronous Server Gateway Interface&#xff09;协议&#xff0c;主要用于创建高效且可维护的 API 服务。 FastAPI 简介 FastAPI 是一个用…

[数据集][目标检测]竹子甘蔗发芽缺陷检测数据集VOC+YOLO格式2953张3类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;2953 标注数量(xml文件个数)&#xff1a;2953 标注数量(txt文件个数)&#xff1a;2953 标注…

tcp 和udp通信

一.recvfrom recvfrom函数是一个系统调用&#xff0c;用于从套接字接收数据。该函数通常与无连接的数据报服务&#xff08;如 UDP&#xff09;一起使用&#xff0c;但也可以与其他类型的套接字使用。与简单的 recv() 函数不同&#xff0c;recvfrom() 可以返回数据来源的地址信息…

秋招力扣Hot100刷题总结——回溯

回溯问题通常应用于解决排列组合等问题&#xff0c;需要注意的是回溯函数中的参数、结束条件、遍历开始顺序等。 回溯三部曲&#xff1a; &#xff08;1&#xff09;确定递归函数的参数。 &#xff08;2&#xff09;确定递归函数的终止条件。 &#xff08;3&#xff09;确定单层…

SQL进阶技巧:最近有效的缺失值填充问题【last_value实现版】

目录 0 场景描述 1 数据准备 2 问题分析 3 小结 0 场景描述 场景:现在有一张商品入库表,包括商品id、商品成本和入库日期3个字段,由于某些原因,导致部分商品的成本缺失(为0或者没有值都是缺失),这样不利于我们计算成本。所以现在要把缺失的商品进价补充完整,补充的…

Hive3:常用查询语句整理

一、数据准备 建库 CREATE DATABASE itheima; USE itheima;订单表元数据 1 1000000 100058 6 -1 509.52 0.00 28155.40 499.33 0 0 lisi shanghai 157 2019-06-22 17:28:15 2019-06-22 17:28:15 1 2 5000000 100061 72 -1 503.86 0.00 38548.00 503.86 1 0 zhangsan shangha…

如何让虚拟机识别到宿主机的USB设备

我的实验环境&#xff1a; Windows宿主机VirtualBox虚拟化软件一个Linux虚机一个8G的USB磁盘 首先要让虚拟机能看到宿主机的USB设备&#xff0c;这是在VirtualBox中设置的。 选中虚机&#xff0c;右键选择“设置”菜单&#xff0c;再单击“USB设备”&#xff1a; 选中“启用…

【分布式系统】关于主流的几款分布式链路追踪工具

Jaeger 标准化与兼容性&#xff1a; Jaeger 支持 OpenTracing 和 OpenTelemetry 标准&#xff0c;这意味着它可以与各种微服务架构和应用框架无缝集成&#xff0c;提供了广泛的兼容性和灵活性。 数据存储选项&#xff1a; Jaeger 支持多种数据存储后端&#xff0c;如 Cassandra…

白卡无法注册TDSCDMA问题分析

1、问题描述 MTK平台 实验室白卡测试TDSCDMA&#xff0c;默认无法注册。使用移动卡测试&#xff0c;无此问题。 2、问题分析 查看Radio log&#xff0c;Radio中反复下发EFUN去开关飞行模式。 39191: 08-14 22:45:57.159210 1469 1512 D RmcWp : [0] ECSRA info E…