嵌入式入门Day35
网络编程 Day2
- 套接字socket
- 基于TCP通信的流程
- 服务器端
- 客户端
- TCP通信API
- 基于UDP通信的流程
- 服务器端
- 客户端
- 作业
套接字socket
- socket套接字本质是一个特殊的文件,在原始的Linux中,它和管道,消息队列,共享内存,信号等一样,都只能进行主机内的通信
- 随着历史的发展,有了TCP/IP协议族的出现,使得socket套接字可以通过网卡,与外部主机进行通信
- socket函数会生成一个文件描述符,不同主机内的进程都可以对该文件描述符进程读写
基于TCP通信的流程
服务器端
- socket:创建原始套接字
- bind:将原始套接字与主机IP绑定(该服务器的身份,服务器以主机的身份通信)
- listen:将原始套接字设置为监听状态
- accept:接收客户端的连接,获取客户端信息,并生成新的套接字描述符用于与客户端通信。
- 发送信息,接收信息,关闭
客户端
- socket:创建套接字
- bind(可选):客户端绑定IP和端口号,绑定后客户端将会使用绑定的IP端口号来访问服务器,如果不绑定系统将会自动分配IP和端口号
- connect:向服务器发送连接请求
- 发送信息,接收信息,关闭
TCP通信API
#include <sys/types.h> /* See NOTES */#include <sys/socket.h>int socket(int domain, int type, int protocol);功能:创建socket套接字描述符参数1:AF_UNIX, AF_LOCAL:本地通信模式AF_INET IPv4 通信AF_INET6 IPv6 通信参数2传输层通信协议:SOCK_STREAM:TCP通信协议SOCK_DGRAM:UDP通信协议参数3:如果参数2指定了TCP或者UDP具体通信协议,参数3可以省略,如果没有指定需要加上参数3.返回值:成功返回套接字描述符,失败返回-1,并置位错误码。eg:socket(AF_INET,SOCK_STREAM,0)#include <sys/types.h> /* See NOTES */#include <sys/socket.h>int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);参数1:套接字描述符参数2;struct sockaddr_in {sa_family_t sin_family; /* IPV4通信协议 */in_port_t sin_port; /* 端口号 */struct in_addr sin_addr; /* IP号(IP地址转化的IP号) */};参数2结构体第三个成员还是结构体如下:struct in_addr {uint32_t s_addr; /* IP地址在网络的形式 */};参数3:参数2的结构体大小。返回值:成功返回0,失败返回-1,并置位错误码。#include <sys/types.h> /* See NOTES */#include <sys/socket.h>int listen(int sockfd, int backlog);功能:监听客户端连接请求参数1:套接字描述符参数2:监听的最大数量是128。返回值:成功返回0,失败返回-1,并置位错误码。#include <sys/types.h> /* See NOTES */#include <sys/socket.h>int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);功能:接收连接请求,并记录连接者的信息(阻塞函数)参数1:套接字描述符参数2:存储连接者的详细信息。参数3:参数2的大小。返回值:成功返回新的描述符,失败返回-1,并置位错误码。int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);功能:与服务器建立连接的函数参数1:套接字描述符参数2:需要连接的服务器具体信息(IP,端口号,通信域等)参数3:参数2的大小。返回值:成功返回0,失败返回-1,并置位错误码
基于UDP通信的流程
服务器端
- 创建套接字
- 绑定主机IP和端口号
- 收发信息
客户端
- 创建套接字
- 收发信息
作业
使用UDP和connect函数实现一对一通信
//服务器
#include <myhead.h>#define IP "192.168.209.241"
#define PORT 6666int main(int argc, const char *argv[])
{//创建UDP套接字int socketfd = socket(AF_INET, SOCK_DGRAM, 0);if (-1 == socketfd){perror("socket");return -1;}//绑定struct sockaddr_in server = {.sin_family = AF_INET,.sin_port = htons(PORT),.sin_addr.s_addr = inet_addr(IP)};if (-1 == bind(socketfd, (struct sockaddr *)&server, sizeof(server))){perror("bind");return -1;}//收发信息struct sockaddr_in client;int client_len = sizeof(client);int flag = 1;char buff[1024] = "";while (1){//记录首个发送信息的客户端并连接while (flag){recvfrom(socketfd,buff,sizeof(buff),0,(struct sockaddr *)&client, &client_len);printf("收到来自%s:%d的信息:%s\n", inet_ntoa(client.sin_addr), ntohs(client.sin_port), buff);if (-1 == connect(socketfd, (struct sockaddr *)&client, client_len)){perror("connect");return -1;}flag = 0;}strcat(buff,"copy");send(socketfd, buff, strlen(buff), 0);bzero(buff, sizeof(buff));recv(socketfd, buff, sizeof(buff), 0);printf("收到来自%s:%d的信息:%s\n", inet_ntoa(client.sin_addr), ntohs(client.sin_port), buff);bzero(buff, sizeof(buff));}return 0;
}
//客户端
#include <myhead.h>#define IP "192.168.209.241"
#define PORT 6666int main(int argc, const char *argv[])
{//创建UDP套接字int socketfd = socket(AF_INET, SOCK_DGRAM, 0);if (socketfd == -1){perror("socket");return -1;}//连接服务器struct sockaddr_in server = {.sin_family = AF_INET,.sin_port = htons(PORT),.sin_addr.s_addr = inet_addr(IP)};if (-1 == connect(socketfd, (struct sockaddr *)&server, sizeof(server))){perror("connect");return -1;}//收发信息,因为使用了connect连接了服务器,所以可以直接使用send和recv函数直接操作char buff[1024] = "";while (1){fgets(buff, sizeof(buff), stdin);buff[strlen(buff)-1] = '\0';
// sendto(socketfd,buff,sizeof(buff),0,(struct sockaddr *)&server, sizeof(server));send(socketfd,buff, strlen(buff),0);bzero(buff,sizeof(buff));
// recvfrom(socketfd,buff,sizeof(buff),0,NULL,NULL);recv(socketfd,buff, sizeof(buff), 0);printf("收到服务器信息:%s\n", buff);}return 0;
}
相关文章:

嵌入式入门Day35
网络编程 Day2 套接字socket基于TCP通信的流程服务器端客户端TCP通信API 基于UDP通信的流程服务器端客户端 作业 套接字socket socket套接字本质是一个特殊的文件,在原始的Linux中,它和管道,消息队列,共享内存,信号等…...

AE/PR/达芬奇模板:自动光标打字机文字标题移动效果动画模板预设
适用于AE/PR/达芬奇的 Typewriter Pro 该模板包括专业的打字机文本动画,并包含很酷的功能,以及帮助文档和分步画外音视频教程。 主要特点 轻松的持续时间控制您可以通过在持续时间控件中输入 start 和 end duration(开始和结束持续时间&…...

RCE漏洞
一、课程知识点 1、远程代码执行漏洞原理与利用 2、常见的代码执行函数 3、常见的命令执行函数 4、常见的绕过姿势 5、命令执行漏洞防范 二、技术目标 1、掌握命令执行漏洞的原理 2、掌握 PHP 命令执行和代码执行的相关函数 3、掌握常见的绕过姿势 4、掌握代码执行漏洞防御措施…...

在开发嵌入式系统时,尤其是处理大数时,会遇到取值范围的问题。51单片机通常没有内建大整数支持,因此我们需要采用不同的方法来解决这一问题
00 两种可行方法分别是: 使用数组存储每一位数据并进行进位运算:通过将大数按位拆分成数组,然后实现逐位加法、进位等操作。使用符号变量进行计算:将数值分成低位和高位,分别用符号变量进行计算。 01:使用…...

【Compose multiplatform教程20】在应用程序中使用多平台资源
为项目设置资源后,生成项目以生成提供资源访问权限的特殊类。要重新生成类和所有资源访问器,请再次生成项目或在 IDE 中重新导入项目。ResRes 之后,您可以使用生成的类从您的代码或外部库访问配置的多平台资源。 自定义访问器类生成 您可以使…...

深入浅出:从入门到精通大模型Prompt、SFT、RAG、Infer、Deploy、Agent
阅读原文 渐入佳境 我们都知道,通过编写一个提示词(prompt),我们可以引导大模型生成回答,从而开启愉快的人工智能对话,比如让模型介绍一下卡皮巴拉。上边简图描述了这个过程,我们拆成两部分 pr…...

紫光同创-盘古200pro+开发板
本原创文章由深圳市小眼睛科技有限公司创作,版权归本公司所有,如需转载,需授权并注明出处(www.meyesemi.com) 一、开发系统介绍 开发系统概述 MES2L676-200HP 开发板采用紫光同创 logos2 系列 FPGA,型号:…...

iOS 中的 nil、Nil、NULL、NSNull 僵尸对象和野指针
iOS 中的 nil、Nil、NULL、NSNull 僵尸对象和野指针-CSDN博客 类型含义使用场景示例nil表示一个指向 Objective - C 对象的空指针。在 Objective - C 和 Swift(与 Objective - C 交互时)中用于表示对象不存在。当一个对象变量没有指向任何有效的对象实例…...

【优选算法】有效三角形的个数(双指针算法)
优质专栏:算法_云边有个稻草人的博客-CSDN博客 目录 【611. 有效三角形的个数 - 力扣(LeetCode)】 解法一: 解法二: 【611. 有效三角形的个数 - 力扣(LeetCode)】 解法一: 三层for…...
中介者模式(Mediator Pattern)、桥接模式(Bridge Pattern) 和 策略模式(Strategy Pattern)
中介者模式(Mediator Pattern)、桥接模式(Bridge Pattern) 和 策略模式(Strategy Pattern) 都是常见的设计模式,它们解决不同类型的问题。我们将通过 Swift 示例来说明它们的使用场景࿰…...
客户案例:基于慧集通打通聚水潭电商ERP与用友U8系统集成之路
一、引言 本原型客户是 生物科技公司,其公司系列抗菌抗病毒产品广泛应用于医疗用品、纺织服饰、家纺用品、母婴护理、女性用品、个人防护等多个领域。在知识产权方面,公司在专业领域已获得商标和专利近百项,创新能力得到了国家及行业内普遍认…...
阿里云clb是什么
传统型负载均衡服务 阿里云CLB(Classic Load Balancer)是阿里云提供的一种传统型负载均衡服务,主要用于将访问流量根据转发策略分发到后端多台云服务器。 CLB的定义和功能 CLB是一种流量分发控制服务,通过设置虚拟服务地…...

【Cursor编辑器】自用经验和实操(迭代更新)
1.启动composer crtl I 2.生成直接一直问加载 3. 实操 生成个知识图谱,使用csv文件里面的数据创关系和节点。...
【学习笔记】ChatGPT原理与应用开发——基础科普
HuggingLLM(ChatGPT原理与应用开发) 原文链接:HuggingLLM(ChatGPT原理与应用开发)-课程详情 | Datawhale 此处仅为学习记录和总结 1:基础科普 1.1:自然语言背景 图灵测试 如果一个人&#x…...
基于Web的实验中心工作管理网站的设计与实现
写作任务 一、课题背景 实验中心承担了全校计算机公共基础课程和学院专业课程,需要对实验中心工作进行有效的管理。 二、课题任务 本课题设计和实现实验中心工作管理系统。 系统的主要内容包括: (1)人员管理; &am…...

docker 安装minio
docker pull minio/minio #启动 mkdir -p /root/minio/config mkdir -p /root/minio/datadocker run -d \--name minio \-p 9002:9000 \-p 9001:9001 \--restartalways \-v /root/minio/data:/data \-v /root/minio/config:/root/.minio \-e "MINIO_ACCESS_KEYminioadmin…...
ubuntu下ipmi的使用(4028)
参考ubuntu系统下配置IPMI_ubuntu ipmi-CSDN博客 参考:ipmitool ubuntu 安装_ipmi centos ubuntu使用总结-CSDN博客 1.安装 sudo apt-get -y install ipmitool 2.加载 modprobe ipmi_msghandlermodprobe ipmi_devintfmodprobe ipmi_si 3.使用,查看不到的话&am…...
周记-唐纳德的《计算机程序设计艺术》
用代码生成代码 开发一个协议,字段有些多,每个字段是QT的属性,需要写Q_PROPERTY,一个一个编辑的话比较繁琐,耗费时间。后来就用代码生成了头文件和源文件,get和set还有signal函数,内容基本都是…...
极品飞车6的快捷键与车辆等级
极品飞车,英文全称为Need for Speed,是EA公司于1994年开始研发的赛车类竞技游戏。从1996年的《极品飞车-特别版》、2002年的《极品飞车:闪电追踪2》、2005年的《极品飞车:地下狂飙2》、到2024年《极品飞车:集结》,是70后、80年、90年等几代人…...

计算机毕业设计Python+知识图谱大模型AI医疗问答系统 健康膳食推荐系统 食谱推荐系统 医疗大数据 机器学习 深度学习 人工智能 爬虫 大数据毕业设计
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
Springboot 项目一启动就获取HttpSession
在 Spring Boot 项目中,HttpSession 是有状态的,通常只有在用户发起 HTTP 请求并建立会话后才会创建。因此,在项目启动时(即应用刚启动还未处理任何请求)是无法获取到 HttpSession 的。 方法一:使用 HttpS…...
Hive的存储格式如何优化?
Hive的存储格式对查询性能、存储成本和数据处理效率有显著影响。以下是主流存储格式的特点、选择标准和优化方法: 一、主流存储格式对比 特性ORC(Optimized Row Columnar)ParquetTextFile(默认)SequenceFile数据布局…...

【春秋云镜】CVE-2022-26965 靶场writeup
知识点 网站的主题或者模块位置一般是可以上传文件的,不过一般为压缩包形式主题或者模块可以上github上找到和cms匹配的源码主题被解压后会放到加入到对应的文件夹中,而且还会自动执行对应的info.php文件(需要主题和cms配套才行)我这里取巧了࿰…...
HTML 等价字符引用:系统化记忆指南
HTML 等价字符引用:系统化记忆指南 在 HTML 中,字符引用(Character Entity References)用于表示保留字符或特殊符号。我将提供一个系统化的方法来记忆这些重要实体,并解释它们的实际应用。 什么是等价字符引用? HTML 字符引用有两种形式: 命名实体:&entity_name…...
CppCon 2014 学习:Defensive Programming Done Right.
这段摘要讲的是: 在组件化开发中,每个开发者负责让自己写的软件易懂且好用,且不易被误用。常见误用之一是调用库函数时未满足前置条件,导致未定义行为。未定义行为的契约(contract)不一定不好,…...

【C++高级主题】转换与多个基类
目录 一、多重继承的虚函数表结构:每个基类一个虚表 1.1 单继承与多重继承的虚表差异 1.2 代码示例:多重继承的虚函数覆盖 1.3 虚表结构示意图 二、指针与引用的类型转换:地址调整的底层逻辑 2.1 派生类指针转基类指针的地址偏移 2.2 …...
鸿蒙OSUniApp 移动端直播流播放实战:打造符合鸿蒙设计风格的播放器#三方框架 #Uniapp
UniApp 移动端直播流播放实战:打造符合鸿蒙设计风格的播放器 在移动互联网时代,直播已经成为一种主流的内容形式。本文将详细介绍如何使用 UniApp 框架开发一个优雅的直播流播放器,并融入鸿蒙系统的设计理念,实现一个既美观又实用…...
容器化革命:告别传统Dockerfile,拥抱现代构建最佳实践
前言 还记得我第一次自信满满地写Dockerfile时,感觉自己像个DevOps天才👑。但很快我就发现,管理这些文件变成了噩梦——安全问题、意外的构建问题、臃肿的镜像层出不穷。如果你一直在手动编写Dockerfile,让我告诉你:有更好的方法! 本文将揭示传统Dockerfile编写方式的…...
mysql分布式教程
MySQL 主从复制 主从复制原理:MySQL 主从复制是指数据可以从一个 MySQL 数据库服务器主节点复制到一个或多个从节点。主库将写操作记录在二进制日志文件中,从库的 IO 线程请求读取主库的二进制日志并写入中继日志,然后 SQL 线程执行中继日志中…...

95套HTML高端大数据可视化大屏源码分享
概述 在大数据时代,数据可视化已成为各行各业的重要需求。这里精心整理了95套高端HTML大数据可视化大屏源码,这些资源采用现代化设计风格,可帮助开发者快速构建专业的数据展示界面。 主要内容 1. 设计风格与特点 采用…...