TCP收发——计算机网络——day02

今天主要讲了TCP的收发

TCP发端步骤

①socket
②connect
③send
④close

TCP收端步骤

①socket
②bind
③listen
④accept
⑤recv
⑥clise

其函数主要有

connect

int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);功能:发送链接请求参数:sockfd:套接字文件描述符addr:目的地址存放空间首地址addrlen:IP地址的大小返回值:成功返回0失败返回-1

send

ssize_t send(int sockfd, const void *buf, size_t len, int flags);功能:发送数据参数:sockfd:文件描述符buf:发送数据空间首地址len:发送数据的长度flags:属性默认为0 返回值:成功返回实际发送字节数失败返回-1

recv

ssize_t recv(int sockfd, void *buf, size_t len, int flags);功能:接收数据 参数:sockfd:套接字文件描述符 buf:存放数据空间首地址len:最大接收数据的长度flags:属性默认为0 返回值:成功返回实际接收字节数失败返回-1 如果对方退出,返回0 

listen

int listen(int sockfd, int backlog);功能:监听客户端发送的连接请求该函数不会阻塞参数:sockfd:套接字文件描述符backlog:允许等待的尚未被处理的三次握手请求的最大个数返回值:成功返回0 失败返回-1 

accept

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);功能:处理等待连接队列中的第一个连接请求该函数具有阻塞功能(如果没有人发送链接请求,会阻塞等待)参数:socket:套接字文件描述符address:存放IP地址的空间首地址addrlen:存放IP地址大小空间首地址返回值:成功返回一个新的文件描述符失败返回-1 

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

send端

#include"head.h"int main(void)
{int sockfd = 0;FILE *fp = 0;int ret = 0;ssize_t nsize = 0;ssize_t nret = 0;char tmpbuff[4096] = {0};struct sockaddr_in srcaddr;char filename[256] = {"a.txt"};gets(filename);srcaddr.sin_family = AF_INET;srcaddr.sin_port = htons(50000);srcaddr.sin_addr.s_addr = inet_addr("192.168.1.152");sockfd = socket(AF_INET,SOCK_STREAM,0);if(-1 == sockfd){perror("fail to socket");return -1;}ret = connect(sockfd,(struct sockaddr *)&srcaddr,sizeof(srcaddr));if(-1 == ret){perror("fail to connect");return -1;}nsize = send(sockfd,filename,strlen(filename),0);if(-1 == nsize){perror("fail to send");return -1;}fp = fopen(filename, "rb");if (fp == NULL) {perror("fail to fopen");return -1;}while(1){memset(tmpbuff,0,sizeof(tmpbuff));sleep(1);nsize = fread(tmpbuff, sizeof(char), 4096, fp);if(0 >= nsize){break;}send(sockfd, tmpbuff,nsize, 0);}close(sockfd);fclose(fp);return 0;
}

recv端

#include"head.h"int main(void)
{FILE *file = NULL;ssize_t nsize = 0;ssize_t nret = 0;char name[20] = {0};char tmpbuff[4096] = {0};int sockfd = 0;int recfd = 0;int ret = 0;struct sockaddr_in recaddr;recaddr.sin_family = AF_INET;recaddr.sin_port = htons(50000);recaddr.sin_addr.s_addr = INADDR_ANY;sockfd = socket(AF_INET,SOCK_STREAM,0);if(-1 == sockfd){perror("fail to socket");return -1;}ret = bind(sockfd,(struct sockaddr *)&recaddr,sizeof(recaddr));if(-1 == ret){perror("fail to bind");return -1;}ret = listen(sockfd,10);if(-1 == ret){perror("fail to listen");return -1;}recfd = accept(sockfd,NULL,NULL);if(-1 == recfd){perror("fail to accept");return -1;}nret = recv(recfd,name,sizeof(name),0);if(-1 == nret){perror("fail to recv");return -1;}file = fopen(name,"wb");while ((nsize = recv(recfd, tmpbuff, sizeof(tmpbuff), 0)) > 0){if (fwrite(tmpbuff, sizeof(char), nsize, file) < nsize){perror("fail to write file");fclose(file);close(recfd);close(sockfd);return -1;}}close(recfd);fclose(file);close(sockfd);return 0;
}

结果:
在这里插入图片描述
以上就是今天内容!

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

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

相关文章

BCI-自我QA 记录

学习中的 Q&A 记录 Q: 事件驱动的语音感知的两种机制 A: 第一种机制是基于对声学能量的快速增加进行感知&#xff08;时域分析&#xff09;。它关注的是声音在时间上的动态变化&#xff0c;特别是声学能量的迅速增加。这种机制可能用来检测语音中的重要事件&#xff0c;如音…

Ribbon简单使用

Ribbon是Netflix发布的云中间层服务开源项目&#xff0c;其主要功能是提供客户端实现负载均衡算法。Ribbon客户端组件提供一系列完善的配置项如连接超时&#xff0c;重试等。简单的说&#xff0c;Ribbon是一个客户端负载均衡器&#xff0c;我们可以在配置文件中Load Balancer后…

React入门 学习全记录(适合和我一样有Vue经验想学习react的同学~)

前端目前的三大框架&#xff1a;Vue、React、Angular比较 都采用了组件化开发的方式&#xff0c;都是基于MVVM的框架有着虚拟DOM&#xff0c;Vue 和 Angular 都采用了响应式设计的方式&#xff0c;当数据发生变化时会自动更新视图。React 和 Angular 的复杂性也使得它们更加适…

个人博客系列-后端项目-用户注册功能(7)

介绍 用户注册API的主要流程&#xff1a;1.前端用户提交用户名&#xff0c;密码 2. 序列化器校验用户名&#xff0c;密码是否合法。3.存入数据库。4.签发token 创建序列化器 from rest_framework import serializers from rest_framework_simplejwt.serializers import Toke…

Map接口

Map接口 Map接口&#xff0c;双列集合&#xff08;每个元素&#xff0c;包含一个键&#xff08;key&#xff09;&#xff0c;一个值对象&#xff08;Value&#xff09;&#xff0c;键与值之间的对应关系叫做映射&#xff09;&#xff0c;Map中每个元素的键不允许重复&#xff…

解决使用torch.cuda.empty_cache()仍然GPU显存无法释放的问题

在开发的过程中&#xff0c;程序已经关闭&#xff0c;但是GPU显存无法释放&#xff0c;在使用pytorch写程序的时候, 有时候会在控制台终止掉正在运行的程序&#xff0c;但是有时候程序已经结束了&#xff0c;nvidia-smi也看到没有程序了&#xff0c;但是GPU的内存并没有释放&a…

记录一次大厂面试题

回流和重绘 浏览器渲染页面步骤&#xff1a; 处理HTML标记并构建DOM树处理css标记并构建CSSOM树将DOM和CSSOM合并成一个渲染树根据渲染树来布局以计算每个节点的几何信息将各个节点绘制到屏幕上 回流&#xff1a;当Render树中部分或全部元素的尺寸、布局、隐藏等改变&#xf…

C++知识点总结(24):栈的真题

概览 P1044 ★★★☆☆ [NOIP2003 普及组] 栈1. 审题题目背景题目描述输入格式输出格式样例1 2. 思路3. 参考答案3.1 卡特兰公式3.2 前缀和 P1044 ★★★☆☆ [NOIP2003 普及组] 栈 1. 审题 题目背景 栈是计算机中经典的数据结构&#xff0c;简单的说&#xff0c;栈就是限制…

算法:数据结构顺序表表的插入、删除和查找

#include <iostream> #include <stdio.h> #define MaxSize 50 typedef int ElemType; typedef struct {ElemType data[MaxSize];int length; }SqList; bool ListInsert(SqList &L,int i,ElemType e)//插入数据 {if(i<1 || i>L.length1)//判断插入的位置是…

自动化运维利器Ansible基础(环境部署)

Ansible 介绍及安装 1. 介绍 Ansible 是⼀个 IT ⾃动化⼯具。它能配置系统、部署软件、编 排更复杂的 IT 任务&#xff0c;如连续部署或零停机时间滚动更新。 Ansible ⽤ Python 编写&#xff0c;尽管市⾯上已经有很多可供选择的 配置管理解决⽅案&#xff08;例如 Salt、Pupp…

Aigtek高压功率放大器设计参数有哪些

高压功率放大器是一种用于放大高频信号的电子设备&#xff0c;广泛应用于通信、雷达、无线电等领域。它能够将输入信号的幅度放大到较高的水平&#xff0c;以便传输或驱动其他设备。 在设计高压功率放大器时&#xff0c;需要考虑以下几个重要参数&#xff1a; 频率范围&#xf…

代码随想录 二叉树—二叉树的层序遍历Ⅱ

思路&#xff1a;就是在上一个题的基础上将result最后翻转了一下&#xff0c;这样就可以实现自下而上的层序遍历。 知识点&#xff1a;stack和queue&#xff0c;也就是栈和队列&#xff0c;是push&#xff1b; 栈stack&#xff1a;push()&#xff0c;pop()&#xff0c;top()&a…

ELK 安装部署

文章目录 1.日志收集规划2.Elasticsearch部署2.1.Elasticsearch安装2.2.Elasticsearch-head安装2.3.Elasticsearch设置分片数2.4.elasticsearch健康检查 3.Kibana部署4.Logstash部署5.Filebeat部署 开源中间件 # Elastic Stackhttps://iothub.org.cn/docs/middleware/ https:/…

工会排队模式:引领创新消费体验的新潮流

在互联网和电子商务的浪潮下&#xff0c;消费者的购物需求与期待正在持续升级。为了迎合这一趋势&#xff0c;工会排队模式应运而生&#xff0c;以其独特的消费体验方式引领市场潮流。 工会排队模式打破了传统电商的桎梏&#xff0c;通过现金返还机制为购物赋予了新的定义。这一…

vue中表单数据规则验证

1、使用:rules属性&#xff0c;如后h5代码 <template> <div class"dialog-box"> <el-scrollbar> <el-form ref"service" :model"serviceForm" :rules"rules" label-width"100px" > <el-row styl…

【微服务】SpringBoot整合Resilience4j使用详解

目录 一、前言 二、熔断器出现背景 2.1 几个核心概念 2.1.1 熔断 2.1.2 限流 2.1.3 降级 2.2 为什么会出现熔断器 2.3 断路器介绍 2.3.1 断路器原理 三、Resilience4j介绍 3.1 Resilience4j概述 3.1.1 Resilience4j是什么 3.1.2 Resilience4j功能特性 3.2 Resilie…

Windows系统安装OpenSSH结合VS Code远程ssh连接Ubuntu【内网穿透】

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法|MySQL| ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-mEkKUraSFHLKkzIj {font-family:"trebuchet ms",verdana,arial,sans-serif;f…

nacos配置更新错误并不会导致已经启动的服务宕机

nacos配置更新错误并不会导致已经启动的服务宕机 但是可能会导致异常

QML GridView 网格视图

作者: 一去、二三里 个人微信号: iwaleon 微信公众号: 高效程序员 和 ListView 一样,GridView 也是基于 Flickable 的视图组件,它们的用法非常相似。不同的是,ListView 中的元素被存储在线性链表中,并以单列(或单行)的形式进行展示的,因此适用于垂直(或水平)列表的…

生成哈夫曼树(100%用例)C卷(JavaPythonC++Node.jsC语言)

给定长度为n的无序的数字数组,每个数字代表二叉树的叶子节点的权值,数字数组的值均大于等于1。请完成一个函数,根据输入的数字数组,生成哈夫曼树,并将哈夫曼树按照中序遍历输出。 为了保证输出的二又树中序遍历结果统一,增加以下限制:二叉树节点中,左节点权值小于等于右…