当前位置: 首页 > news >正文

嵌入式学习第二十六天!(网络传输:TCP编程)

TCP通信:

    1. TCP发端:

        socket  ->  connect  ->  send  ->  recv  ->  close

    2. TCP收端:

        socket  ->  bind  ->  listen  ->  accept  -> recv  ->  send  ->  close

    3. TCP需要用到的函数:

        1. connect:

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

              功能:发送链接请求

              参数:

                  sockfd:套接字文件描述符

                  addr:目的地址存放空间首地址

                  addrlen:IP地址的大小

              返回值:

                   成功返回0
                   失败返回-1

        2. send:

ssize_t send(int sockfd, const void *buf, size_t len, int flags);

              功能:发送数据

              参数:

                  sockfd:文件描述符

                  buf:发送数据空间首地址

                  flags:属性默认为0

              返回值:

                  成功返回实际发送字节数
                  失败返回-1

        3. recv:

ssize_t recv(int sockfd, void *buf, size_t len, int flags);

                功能:接收数据

                参数:

                    sockfd:套接字文件描述符

                    buf:存放数据空间首地址

                    len:最大接收数据的长度

                    flags:属性,默认为0

                返回值:

                    成功返回实际接收字节数
                    失败返回-1 
                    如果对方退出,返回0 

        4. listen:

int listen(int sockfd, int backlog);

                功能:监听客户端发送的连接请求(该函数不会阻塞)

                参数:

                    sockfd:套接字文件描述符

                    backlog:允许等待的尚未被处理的三次握手请求的最大个数

                返回值:

                    成功返回0 
                    失败返回-1 

        5. accept:

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

                功能:处理等待连接队列中的第一个连接请求,该函数具有阻塞功能(如果没有人发送链接请求,会阻塞等待)

                参数:

                    socket:套接字文件描述符

                    address:存放IP地址的空间首地址

                    addrlen:存放IP地址大小空间首地址

                返回值:

                    成功返回一个新的文件描述符
                    失败返回-1

        4. TCP编程练习:

                1. 利用TCP实现跨主机的文件发送:

send.c

#include "head.h"int main(void)
{FILE *fd = NULL;int sockfd = 0;int ret = 0;struct sockaddr_in severaddr;ssize_t nsize = 0;size_t rret = 0;char filename[100] = {0};char tmpbuff[1024] = {0};sockfd = socket(AF_INET, SOCK_STREAM, 0);if(sockfd == -1){perror("fail to socket");return -1;}severaddr.sin_family = AF_INET;severaddr.sin_port = htons(50000);severaddr.sin_addr.s_addr = inet_addr("192.168.1.162");ret = connect(sockfd,(struct sockaddr *)&severaddr, sizeof(severaddr));if(ret == -1){perror("fail to connect");return -1;}scanf("%s", filename);fd = fopen(filename, "r");if(fd == NULL){perror("fail to fopen");return -1;}nsize = send(sockfd, filename, strlen(filename), 0);if(nsize == -1){perror("fail to send");return -1;}while(1){memset(tmpbuff, 0, sizeof(tmpbuff));rret = fread(tmpbuff, 1, sizeof(tmpbuff), fd);if(rret == 0){break;}usleep(1000);nsize = send(sockfd, tmpbuff, rret, 0);if(nsize == -1){perror("fail to send");return -1;}}fclose(fd);close(sockfd);return 0;}

recv.c

#include "head.h"int main(void)
{FILE *fd = NULL;int ret = 0;int sockfd = 0;int contfd = 0;ssize_t nsize = 0;char *ptmp = NULL;char tmpbuff[1024] = {0};struct sockaddr_in serveraddr;serveraddr.sin_family = AF_INET;serveraddr.sin_port = htons(50000);serveraddr.sin_addr.s_addr = INADDR_ANY;sockfd = socket(AF_INET, SOCK_STREAM, 0);if(sockfd == -1){perror("fail to socket");return -1;}ret = bind(sockfd, (struct sockaddr *)&serveraddr, sizeof(serveraddr));if(ret == -1){perror("fail to ret");return -1;}ret = listen(sockfd, 10);if(ret == -1){perror("fail to listen");return -1;}contfd = accept(sockfd, NULL, NULL);if(contfd == -1){perror("fail to accept");return -1;}nsize = recv(contfd, tmpbuff, sizeof(tmpbuff), 0);if(nsize == -1){perror("fail to recv");return -1;}fd = fopen(tmpbuff, "w");if(fd == NULL){perror("fail to fopen");return -1;}while(1){memset(tmpbuff, 0, sizeof(tmpbuff));nsize = recv(contfd, tmpbuff, sizeof(tmpbuff), 0);if(nsize <= 0){break;}fwrite(tmpbuff, 1, nsize, fd);}fclose(fd);close(contfd);close(sockfd);return 0;
}

相关文章:

嵌入式学习第二十六天!(网络传输:TCP编程)

TCP通信&#xff1a; 1. TCP发端&#xff1a; socket -> connect -> send -> recv -> close 2. TCP收端&#xff1a; socket -> bind -> listen -> accept -> recv -> send -> close 3. TCP需要用到的函数&#xff1a; 1. co…...

【LeetCode】升级打怪之路 Day 14:二叉树的遍历

今日题目&#xff1a; 144. 二叉树的前序遍历94. 二叉树的中序遍历145. 二叉树的后序遍历102. 二叉树的层序遍历107. 二叉树的层序遍历 II199. 二叉树的右视图637. 二叉树的层平均值429. N 叉树的层序遍历515. 在每个树行中找最大值116. 填充每个节点的下一个右侧节点指针117. …...

[Unity实战]使用NavMeshAgent做玩家移动

其实除了Character Controller, Rigidbody&#xff0c;我们还可以使用NavMeshAgent去做。这么做的好处是能避免玩家去莫名其妙的地方&#xff08;毕竟基于烘焙过的导航网格&#xff09;&#xff0c;一般常见于元宇宙应用和mmo。 根据Unity手册&#xff0c;NavMeshAgent 也有和…...

官网:随便搞个?那不如不搞,搞不好就给公司减分了。

官网建设确实需要认真对待&#xff0c;不能随便搞。一个粗制滥造的官网可能会给公司带来负面影响&#xff0c;降低品牌形象和用户体验。以下是一些官网建设的重要原则&#xff1a; 专业性&#xff1a;官网应该展示公司的专业性和专业知识。它应该以专业的设计、内容和功能来展示…...

Ansible 基础入门

2&#xff09;Ansible 介绍 Ansible 基本概念 Ansible 是一种自动化运维工具&#xff0c;基于 Paramiko 开发的&#xff0c;并且基于模块化工作&#xff0c;Ansible 是一种集成 IT 系统的配置管理、应用部署、执行特定任务的开源平台&#xff0c;它是基于 Python 语言&#xf…...

讨论:5万官网是建站界的劳斯莱斯了吧,到了软件开发领域呢?

如题&#xff0c;所以赛道选择很重要&#xff0c;当然难度系数也不一样。能花5万元做官网的&#xff0c;凤毛麟角&#xff0c;如果是做软件开发&#xff0c;5万元顶多算个起步价&#xff0c;老铁们&#xff0c;是这样吗&#xff1f;...

手写分布式配置中心(三)增加实时刷新功能(短轮询)

要实现配置自动实时刷新&#xff0c;需要改造之前的代码。代码在https://gitee.com/summer-cat001/config-center​​​​​​​ 服务端改造 服务端增加一个版本号version&#xff0c;新增配置的时候为1&#xff0c;每次更新配置就加1。 Overridepublic long insertConfigDO(…...

【RabbitMQ】WorkQueue

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;MQ ⛺️稳中求进&#xff0c;晒太阳 Work Queues Work queues任务模型&#xff0c;简单来说就是让多个消费者绑定到一个队列&#xff0c;共同消费队列中的消息 当消息处理比较耗时的时候&…...

国内免费好用 Chat GPT推荐

无论您是寻找技术洞见还是灵感激发&#xff0c;此网站是您的绝佳去处。探索着名作家的精彩观点和创意解决方案&#xff0c;它不仅是知识的源泉&#xff0c;更是思维的驱动力。在这里&#xff0c;您将发现无尽的学习资源和启发&#xff0c;助您不断前行这是一款基于OpenAi开发的…...

基于springboot实现在线考试系统项目【项目源码+论文说明】

基于springboot实现在线考试系统演示 摘要 时代在变化&#xff0c;科技技术以无法预测的速度在达到新的高度&#xff0c;并且被应用于社会生活的各个领域&#xff0c;随着生活的加快&#xff0c;也使很多潜在的点逐渐突显出来&#xff0c;社会对于人才的要总是非常迫切的&…...

golang中go build 后读取配置文件

golang打包后读取配置文件 在用go写代码的时候&#xff0c;为了好用经常使用go build 打包&#xff0c;如果我们用到了配置文件&#xff0c;就总是导致不能找到文件所在位置了出现bug&#xff0c;所以以下代码就解决了这个问题。 核心代码&#xff1a; file, err : exec.Look…...

为raspberrypi编译bpftrace调试工具

基于eBPF的嵌入式应用调试 笔者之前写过几篇有关于使用eBPF调试Linux内核和应用的博客&#xff0c;其中提到&#xff0c;在嵌入式设备上使用BCC或bpftrace是不可行的&#xff1b;主要原因在于嵌入式设备的资源有限&#xff0c;而这两个调试工具依赖python/clang/llvm等库&…...

分段线性化问题探析

目录 1 使用0-1变量将分段函数转换为线性约束 2 连续函数采用分段线性化示例 3 matlab程序测试 4 matlab测试结果说明 5 分段线性化应用 1 使用0-1变量将分段函数转换为线性约束 2 连续函数采用分段线性化示例 3 matlab程序测试 clc;clear all; gn10;tn1; x_pfsdpvar(1, t…...

从零学算法2917

2917.给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。 nums 中的 K-or 是一个满足以下条件的非负整数&#xff1a; 只有在 nums 中&#xff0c;至少存在 k 个元素的第 i 位值为 1 &#xff0c;那么 K-or 中的第 i 位的值才是 1 。 返回 nums 的 K-or 值。 注意 &#xf…...

[HackMyVM] 靶场 Wave

kali:192.168.56.104 主机发现 arp-scan -l # arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:d2:e0:49, IPv4: 192.168.56.104 Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan) 192.168.56.1 0a:00:27:00:00:05 (Un…...

云渲染平台都开始涨价了?2024年性价比高的云渲染平台推荐

最近部分云渲染平台开始涨价&#xff0c;不论是通过调整机器性能&#xff0c;还是直接提价&#xff0c;都会对成本产生影响。这对已经习惯了平台价格的用户来说&#xff0c;并不是一件好事。这里举一些例子&#xff1a; 比如平台A&#xff0c;原“首小时渲染0.66元模式”已经下…...

搜索-BFS Meteor Shower S(流星雨)

Meteor Shower S&#xff08;流星雨&#xff09; 题目连接 题目描述 贝茜听说一场特别的流星雨即将到来&#xff1a;这些流星会撞向地球&#xff0c;并摧毁它们所撞击的任何东西。她为自己的安全感到焦虑&#xff0c;发誓要找到一个安全的地方&#xff08;一个永远不会被流星…...

RabbitMQ实战:Springboot集成RabbitMQ并验证五种消息模型

这目录 一、添加依赖二、配置文件中添加RabbitMQ访问配置三、消息生产者代码四、消息消费者代码五、验证参考资料 一、添加依赖 <!--AMQP依赖&#xff0c;包含RabbitMQ--><dependency><groupId>org.springframework.boot</groupId><artifactId>s…...

配置与管理防火墙

配置与管理防火墙 1&#xff0c;概念&#xff1a;设置在不同网络或网络安全域之间的一系列部件的组合。 2&#xff0c;功能&#xff1a;保护内网中易手攻击的服务&#xff1b;控制内外网之间网络系统的访问&#xff1b;隐藏内网的IP地址及结构的细节&#xff0c;提高网络保护…...

【SpringBoot】-- 实现本地文件/图片上传到服务器生成url地址

在java项目中你可能会有以下需求&#xff1a;用户上传本地图片&#xff0c;然后展示在网页上。本篇文章将使用阿里云oss实现上传图片到oss&#xff0c;oss生成url。 一、准备工作 首先进入阿里云&#xff0c;按如下操作 进入创建页面&#xff0c;修改读写权限为公共读 然后进…...

计算机基础专升本笔记十四-计算机网络基础(一)

计算机基础专升本笔记十四-计算机网络基础&#xff08;一&#xff09; 一、计算机网络的发展历程 第一代计算机网络&#xff08;数据通信&#xff09; 以数据通信为主的第一代计算机网络。主要是指美国军方用于防控系统的一种联机系统。它只是计算机网络的雏形。 第二代计算…...

【华为OD机试】转盘寿司【C卷|100分】

【华为OD机试】-真题 !!点这里!! 【华为OD机试】真题考点分类 !!点这里 !! 题目描述 寿司店周年庆,正在举办优惠活动回馈新老客户。 寿司转盘上总共有 n 盘寿司,prices[i] 是第 i 盘寿司的价格, 如果客户选择了第 i 盘寿司,寿司店免费赠送客户距离第 i 盘寿司最近的下一…...

使用Node JS获取WI-FI密码

演示效果 全局安装wifi-password-cli依赖 shell 复制代码 npm install wifi-password-cli -g # or npx wifi-password-cli 使用 shell 复制代码 $ wifi-password [network-name] $ wifi-password 12345678 $ wifi-password 办公室wifi a1234b2345 觉得Node.js很神奇是…...

先缓存第二集抖音接入 ,最近加班猛,就分享简单的知识,如何使用:关于使用replace的用法正则表达式

1、需求&#xff1a;比如在cocos creator策划让你制作一个预制体&#xff0c;标题要读取配置&#xff0c;然后中间显示的内容要滚动的&#xff0c;要做成一个通用的&#xff0c;然后给到的配置表是这样子的: 配置表&#xff1a;假设字段是这样子的 content "内容标题&…...

企微hook源码

企微hook源码已经在QQ群内开源。速度进群下载&#xff0c;避免和谐。 QQ群&#xff1a;649480745...

vsphere虚拟机迁移是灰色如何解决

vsphere虚拟机迁移是灰色如何解决 问题描述&#xff1a; 在vsphere中&#xff0c;迁移虚拟机时迁移按钮是灰色&#xff0c;无法迁移&#xff0c;关机之后也无法迁移 虚拟机按钮为灰色 找到虚拟机存储对应的位置&#xff0c;查询是否有.vmx虚拟机文件 查询中发现有.vmx文件存…...

swift 闭包捕获列表

以下函数会打印出什么&#xff1f; var car "Benz" let closure { [car] in print("I drive \(car)") } car "Tesla" closure() 因为 clousre 已经申明将 car 复制进去了&#xff08;[car]&#xff09;&#xff0c;此时clousre 里的 car…...

JavaWeb04-Request,Response

目录 一、Request&#xff08;请求&#xff09; 1.作用 2.继承体系 3.获取请求数据 &#xff08;1&#xff09;请求行 &#xff08;2&#xff09;请求头 &#xff08;3&#xff09;请求体&#xff08;POST&#xff09; &#xff08;5&#xff09;Request通用方式获取请求…...

使用 Docker 部署 Fiora 在线聊天室平台

一、Fiora 介绍 Fiora 简介 Fiora 是一款开源免费的在线聊天系统。 GitHub&#xff1a;https://github.com/yinxin630/fiora Fiora 功能 注册账号并登录&#xff0c;可以长久保存你的数据加入现有群组或者创建自己的群组&#xff0c;来和大家交流和任意人私聊&#xff0c;并添…...

Unity Samples和帧动画的问题

拖动序列帧图片和自己创建clip的帧率不同 我今天在创建帧动画的时候用了两种方式第一种是直接拖动序列帧图片到Hierachy&#xff0c;然后生成的第二种是这样我发现两者播放的动画速率不一样最后查了半天查不到原因。最后发现是Samples的原因&#xff0c;而且Unity把Samples这个…...