TCP 和UDP通信流程
TCP 通信流程
UDP 通信流程
TCP 通信程序简单实例
客户端程序实例:
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>void* read_ser(void *pad)
{pthread_detach(pthread_self()); //线程分离int soke_c=*(int*)pad;while (1){char buf[1024] = {0};int ret = read(soke_c,buf,1024);if(ret <= 0){perror("read error");pthread_exit(NULL);}printf("字节长度:%d,收到的信息:%s\n",ret,buf);}
}int main(int argc, char const *argv[])
{if(argc != 3) //打开失败{printf("bro,you arg not Yes\n");return -1;}/*连接服务器*/int sock = socket(AF_INET, SOCK_STREAM, 0); //申请一个 IPV4 的流式套接字if(sock == -1) //申请套接字失败{perror("create socket error");return -1;}struct sockaddr_in Saddr; //保存服务器的地址信息的结构体memset(&Saddr,0,sizeof(struct sockaddr_in)); //清空结构体Saddr.sin_family = AF_INET; //协议族,AF_INET 表示使用 IPV4 的协议族Saddr.sin_port = htons(atoi(argv[2])); //端口号,但是要求的是网络字节序Saddr.sin_addr.s_addr = inet_addr(argv[1]); //32bit 的一个 IP地址int r = connect(sock,(struct sockaddr*)&Saddr,sizeof(Saddr)); //连接服务器if(r == -1) //连接失败{perror("connect error");return -1;}printf("连接成功,连接的服务器 ip 是%s,端口号是%s\n",argv[1],argv[2]);pthread_t tid;pthread_create(&tid, NULL,read_ser, (void*)&sock); //创建线程去接收服务器消息while(1){ char buf[1024] = {0};memset(buf,0,sizeof(buf));scanf("%[^\n]",buf);printf("%ld\n",strlen(buf));int ret = write(sock,buf,strlen(buf));if(ret <= 0){perror("sendto error");return -1;}printf("写了多少个字节:%d\n",ret);}close(sock); //关闭套接字return 0;
}
服务端程序实例:
#include<stdio.h>
#include<stdlib.h>
#include <signal.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <arpa/inet.h>
#include<netinet/in.h> //为了使用 IPV4 地址结构体
#include <string.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <pthread.h>//线程函数,处理和一个客户端的通信
void *my_func(void *arg)
{//线程分离pthread_detach(pthread_self());int *cp = (int *)arg;int ret;while(1){ret = sendto(*cp,"nishiliangzaima?",20,0,NULL,0); //发送消息if(ret <= 0){perror("sendto error");free(cp);pthread_exit(NULL);}char buf[1024] = {0};ret = read(*cp,buf,1024); //读取消息if(ret <= 0){perror("recv error");free(cp);pthread_exit(NULL);}printf("recv size:%d,recv data:%s\n",ret,buf);}
}//./main ip port
int main(int argc,char *argv[])
{if(argc != 3){printf("please input ip + port!\n");return 0;}//1.创建一个套接字int sockfd = socket(AF_INET, SOCK_STREAM,0);if(-1 == sockfd){perror("create socket failed");exit(-1);}//2.绑定一个通信 IP 地址(作为服务器本身的 IP)struct sockaddr_in saddr; //保存服务器的地址(IP+port)memset(&saddr,0,sizeof(struct sockaddr_in)); //清空结构体saddr.sin_family = AF_INET;inet_aton(argv[1], &saddr.sin_addr);saddr.sin_port = htons(atoi(argv[2]));int ret = bind(sockfd,(struct sockaddr *)&saddr,sizeof(saddr));if(ret == -1){perror("bind error");exit(-1);}printf("bind success\n");//3.开启对一个套接字的监听listen(sockfd,250);//4.等待客户端的连接while(1){struct sockaddr_in caddr; //保存客户端的地址(IP+port)socklen_t len = sizeof(caddr);int *confp = (int *)malloc(sizeof(int));*confp = accept(sockfd,(struct sockaddr *)&caddr,&len);if(*confp > 0) //客户端连接成功,返回一个连接套接字专门用来和客户端通信{//一个客户端连接成功.开一个进程/线程去处理这个连接printf("client IP:%s,clientPort:%d\n",inet_ntoa(caddr.sin_addr),ntohs(caddr.sin_port));pthread_t tid;pthread_create(&tid,NULL,my_func,(void *)confp); //创建线程去处理和客户端的会话}}//关闭套接字shutdown(sockfd,SHUT_RDWR);close(sockfd);return 0;
}
UDP 通信程序简单实例
A 端:客户端
#include<stdio.h>
#include<stdlib.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <arpa/inet.h>
#include<netinet/in.h> //为了使用 IPV4 地址结构体
#include <string.h>
#include <arpa/inet.h>
#include <unistd.h>//./main ip port
int main(int argc,char *argv[])
{if(argc != 3) //判断输入是否正确{printf("please input ip + port!\n");return 0;}//1.创建一个 UDP 套接字int sockfd = socket(AF_INET,SOCK_DGRAM,0); //创建一个 IPV4 的数据报套接字if(-1 == sockfd){perror("create socket failed");exit(-1);}//直接发送消息(定义一个接收消息的地址)struct sockaddr_in addr; //保存接收消息的地址(IP+port)memset(&addr,0,sizeof(struct sockaddr_in)); //清空结构体addr.sin_family = AF_INET;inet_aton(argv[1], &addr.sin_addr);addr.sin_port = htons(atoi(argv[2]));while(1){char buf[1024] = {0};fgets(buf,1024,stdin);int ret = sendto(sockfd,buf,strlen(buf),0,(struct sockaddr *)&addr,sizeof(addr));//发送数据if(ret <= 0){perror("sendto error");}printf("sendto size:%d\n",ret);//读取服务器的回复消息memset(buf,0,1024);struct sockaddr_in src_addr; //保存消息发送方的地址(IP+port)memset(&src_addr,0,sizeof(struct sockaddr_in)); //清空结构体socklen_t src_len = sizeof(src_addr); //保存可用大小ret = recvfrom(sockfd,buf,1024, 0,(struct sockaddr*)&src_addr,&src_len); //接收消息if(ret <= 0){perror("recvfrom error");}printf("sendIP:%s,sendPort:%d\n",inet_ntoa(src_addr.sin_addr),ntohs(src_addr.sin_port));printf("recv size:%d,recv data:%s\n",ret,buf);}//关闭套接字shutdown(sockfd,SHUT_RDWR);close(sockfd);return 0;
}
#include<stdio.h>
#include<stdlib.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <arpa/inet.h>
#include<netinet/in.h> //为了使用 IPV4 地址结构体
#include <string.h>
#include <arpa/inet.h>
#include <unistd.h>//./main ip port
int main(int argc,char *argv[])
{if(argc != 3){printf("please input ip + port!\n");return 0;}//1.创建一个 UDP 套接字int sockfd = socket(AF_INET, SOCK_DGRAM,0); //创建一个 IPV4 的数据报套接字if(-1 == sockfd){perror("create socket failed");exit(-1);}//2.绑定(可不绑定)struct sockaddr_in addr; //本地服务器的地址(IP+port)memset(&addr,0,sizeof(struct sockaddr_in)); //清空结构体addr.sin_family = AF_INET;inet_aton(argv[1], &addr.sin_addr);//addr.sin_addr.s_addr = INADDR_ANY; //让内核自动选择一个网卡addr.sin_port = htons(atoi(argv[2]));int ret = bind(sockfd,(struct sockaddr *)&addr,sizeof(addr)); //绑定一个 IP 和端口号,可不绑定if(ret == -1){perror("bind error");exit(-1);}printf("bind success\n");while(1){char buf[1024] = {0};//读取别人发送的消息struct sockaddr_in src_addr; //保存消息发送方的地址(IP+port)memset(&src_addr,0,sizeof(struct sockaddr_in)); //清空结构体socklen_t src_len = sizeof(src_addr); //保存可用大小ret = recvfrom(sockfd,buf,1024, 0,(struct sockaddr*)&src_addr,&src_len); //接收消息if(ret <= 0){perror("recvfrom error");}printf("sendIP:%s,sendPort:%d\n",inet_ntoa(src_addr.sin_addr),ntohs(src_addr.sin_port));printf("recv size:%d,recv data:%s\n",ret,buf);ret = sendto(sockfd,buf,strlen(buf),0,(struct sockaddr *)&src_addr,sizeof(src_addr)); //发送消息if(ret <= 0){perror("sendto error");}}//关闭套接字shutdown(sockfd,SHUT_RDWR);close(sockfd);return 0;
}
相关文章:
TCP 和UDP通信流程
TCP 通信流程 根据上图可以看到,TCP 服务器和客户端通信分为 TCP 服务端和客户端,需要先建立服务 端然后再建立客户端与之连接进行数据交互。 服务端编程步骤: 1.使用 socket 创建流式套接字 2.使用 bind 绑定将服务器绑定到 IP 3.listen…...
Swift SwiftUI CoreData 过滤数据 1
Xcode: Version 14.3.1 (14E300c) iOS: 16 预览: Code: import SwiftUI import CoreDatastruct TodosSearch: View {State private var search_title "测试"FetchRequest var todos_search: FetchedResults<Todo>init() {let request: NSFetchReq…...
【uniapp】subnvue组件数据更新视图未更新问题
背景 : 页面中的弹窗使用了subnvue来写, 根据数据依次展示一个一个的弹窗, 点击"关闭"按钮关闭当前弹窗, 显示下一个弹窗 问题 : 当点击关闭时( 使用的splice() ), 数据更新了 , 而视图没有更新, 实际上splice() 是不仅更新数据, 也可以更新视图的 解决 : this.$fo…...
Unity编辑器拓展-Odin
1.相比于原生Unity的优势 Unity不支持泛型类型序列化,例如字典原生Unity不支持序列化,而Odin可以继承序列化的Mono实现功能强大且使用简单,原生Unity想实现一些常见的功能需要额外自己编写Unity扩展的编码,实现功能只需要加一个特…...
小红书婴童产业探索,解析消费者需求!
在消费升级、市场引导的背景下,众多产业都在悄然发生着变化,其中“婴童产业”就是非常有代表性的一个。今天就来深入分析小红书婴童产业探索,解析消费者需求! 一、何为婴童产业 事实上,婴童产业,并不仅仅局…...
离线安装mysql客户端
下载路径 oracle网站总是在不断更新,所以下载位置随时可能变动但万变不离其宗,学习也要学会一通百通。 首先直接搜索,就能找找到mysql官网 打开网站,并点击 DOWNLOADS 往下滚动,找到社区版下载按钮。…...
Docker 数据管理
管理 Docker 容器中数据主要有两种方式: 数据卷(Data Volumes) 数据卷容器(DataVolumes Containers)。 数据卷 数据卷是一个供容器使用的特殊目录,位于容器中。可将宿主机的目录挂载到数据卷上…...
数据统计--图形报表--ApacheEcharts技术 --苍穹外卖day10
Apache Echarts 营业额统计 重点:已完成订单金额要排除其他状态的金额 根据时间选择区间 设计vo用于后端向前端传输数据,dto用于后端接收前端发送的数据 GetMapping("/turnoverStatistics")ApiOperation("营业额统计")public Result<TurnoverReportVO…...
【kubernetes的三种网络】
kubernetes的三种网络 一、三种网络service网络(service是虚拟IP地址)pod网络(pod的IP地址 docker容器的IP)节点网络(网络服务器上的物理网卡IP) 二、其他网络flannel一、vxlan(隧道方案)1.定义2.优势3.工作…...
Java中树形菜单的实现方式(超全详解!)
前言 这篇文中,我一共会用两种方式来实现目录树的数据结构,两种写法逻辑是一样的,只是一种适合新手理解,一种看着简单明了但是对于小白不是很好理解。在这里我会很详细的讲解每一步代码,主要是方便新人看懂࿰…...
基于Uniswap V3的去中心化前端现货交易平台Oku正式登陆Moonbeam
波卡上的Uniswap v3合约由Moonbeam智能合约、Oku前端,以及Wormhole远程路由技术共同实现。 跨链互连应用的最佳去中心化开发平台Moonbeam宣布Uniswap现已正式登陆。此次是Uniswap产品作为一个主流的DEX首次涉足Polkadot生态。用户可以通过新的、易于使用的Oku界面与…...
leetcode 每日一题复盘(10.9~10.15)
leetcode 101 对称二叉树 这道题一开始想是用层序遍历,看每一层是否都对称,遇到一个问题就是空指针(子树为空)无法记录下来,同时会导致操作空指针的问题,因此需要修改入队条件,并用一个标志去表示空指针 vector<int>numv;for(int i0;i<size;i){TreeNode*frontque.fro…...
【云计算网络安全】DDoS 缓解解析:DDoS 攻击缓解策略、选择最佳提供商和关键考虑因素
文章目录 一、前言二、什么是 DDoS 缓解三、DDoS 缓解阶段四、如何选择 DDoS 缓解提供商4.1 网络容量4.2 处理能力4.3 可扩展性4.4 灵活性4.5 可靠性4.6 其他考虑因素4.6.1 定价4.6.2 所专注的方向 文末送书《数据要素安全流通》本书编撰背景本书亮点本书主要内容 一、前言 云…...
如何巧用AI智能技术,让文物不再“无人问津”?
文物是文化与传统的象征,而博物馆则是展现文物的载体。传统的博物馆监控体系只是利用摄像头进行监控,无法将人工智能融入其中,使其更加智能化、信息化。那么,如何将AI技术与传统视频监控相融合呢?TSINGSEE青犀智能分析…...
一天一八股——SSL/TLS协议
早期设计的http协议存在诸多的问题,SSL/TLS在http的基础上保证了数据的保密,验证和身份验证 https的保密性通过混合加密的方式保证,解决窃听问题https数据的完整性通过摘要算法保证,通过数字证书CA的方式进行数据来源和数据可靠性…...
SpringCloud学习笔记-Eureka服务的搭建
目录 1.首先引入依赖2.main中配置注解3.src/main/resources/application.yml配置文件 本文的主要工作是介绍如何搭建一个Eureka服务 1.首先引入依赖 pom文件中加入依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring…...
css如何实现页面布局与五种实现方式
CSS布局实现的主要方式有以下几种: 一、盒模型布局:CSS中,每个元素都是一个盒子,包括内容、内边距、边框和外边距。通过设置盒子的属性(如宽度、高度、内边距、边框、定位等),可以实现不同的布…...
cv2.split函数与cv2.merge函数
split函数用于图像BGR通道的分离 merge函数用于可将分开的图像通道合并到一起 1.split函数的使用 这是原图,我们使用split函数对其三个通道进行分离。 注意:split函数分离通道的顺序是B、G、R。 以下方法是将三个通道的值都设置为与某一个通道相同。…...
Vue--1.7watch侦听器(监视器)
作用:监视数据变化,执行一些业务逻辑或异步操作。 语法: 1.简单写法->简单类型数据,直接监视 const app new Vue({el: #app,data: {words:},watch:{words(newValue,oldValue){}}}) const app new Vue({el: #app,data: {obj…...
序列:全序关系
一个序列满足全序关系必须满足以下条件: 反对称性:若 a ≤ b a\le b a≤b,则 b ≥ a b\ge a b≥a传递性:若 a ≤ b a\le b a≤b 且 b ≤ c b\le c b≤c,则 a ≤ c a\le c a≤c完全性: a ≤ b a\le b …...
100M服务器能同时容纳多少人访问?
100M的服务器带宽能够同时容纳的用户访问量需要考虑以下几个关键因素: 👉1.单个用户的平均访问流量大小 这取决于网站内容,是否有多媒体等。一般文本类网站每用户每次访问在50-100KB。 👉2.每个用户的平均访问页面 通常每次访问会打开多个页面 &…...
Javascript 笔记:函数调用与函数上下文
在 JavaScript 中,函数上下文通常指的是函数在执行时的当前对象的引用,这通常用 this 关键字表示。this 关键字在不同的执行上下文中可能引用到不同的对象。 1 全局上下文 当 this 关键字用在全局上下文(不在任何函数内部)&#…...
【WebService】C#搭建的标准WebService接口,在使ESB模版作为参数无法获取参数数据
一、问题说明 1.1 问题描述 使用C# 搭建WebService接口,并按照ESB平台人员的要求,将命名空间改为"http://esb.webservice",使用PostmanESB平台人员提供的入参示例进行测试时,callBussiness接口参数message始终为null。 以下是ES…...
Sqlserver关于tempdb临时数据库文件个数的最佳实践
官方文档 https://learn.microsoft.com/zh-cn/sql/relational-databases/databases/tempdb-database?viewsql-server-ver16 https://learn.microsoft.com/en-US/troubleshoot/sql/database-engine/performance/recommendations-reduce-allocation-contention 一般而言&#x…...
【Java】微服务——微服务介绍和Eureka注册中心
目录 1.微服务介绍2.服务拆分和远程调用2.1.提供者与消费者 3.Eureka注册中心3.1.Eureka的结构和作用3.2.Eureka的结构3.3.搭建Eureka服务3.3.1.引入eureka依赖3.3.2.编写配置文件 3.4.服务注册及拉1)引入依赖2)配置文件3)启动多个user-servi…...
C++ virtual 虚函数 虚基类
https://blog.csdn.net/xbb123456rt/article/details/81986691 基类指针可以指向一个派生类对象,但派生类指针不能指向基类对象。 可以在基类中将被重写的成员函数设置为虚函数,其含义是:当通过基类的指针或者引用调用该成员函数时…...
redis分布式秒杀锁
-- 获取锁标识,是否与当前线程一致? if(redis.call(get, KEYS[1]) ARGV[1]) then-- 一致,删除return redis.call(del, KEYS[1]) end -- 不一致,直接返回 return 0package com.platform.lock;public interface ILock {/*** 获取锁…...
【Redis】String内部编码方式
String内部编码方式 int: 8个字节的长整型embstr: 小于等于39个字节的字符串raw: 大于39个字节的字符串...
川西旅游网系统-前后端分离(前台vue 后台element UI,后端servlet)
前台:tour_forword: 川西旅游网前端----前台 (gitee.com) 后台:tour_back: 川西旅游网-------后台 (gitee.com) 后端 :tour: 川西旅游网------后端 (gitee.com)...
Paddle使用pyinstaller打包出错的解决方法
使用PyQt5开发了一个基于paddle ocr的文字识别程序,打包的时候报错了。给大家分享一下解决方法https://juejin.cn/post/7287562282669883451 为了测试paddle模块的打包问题,所以当前demo.py只引用了paddleOCR模块demo.py from paddleocr import PaddleO…...
广州网站建设互广/小说网站排名
---恢复内容开始--- 事件 好不容易回到正轨,好好学习,天天向上。今天写的是事件,感觉内容蛮多的,所以分了两篇写,主要写了事件流、事件处理程序、事件对象。恩,明天还会再有一篇,哈哈哈。我努力…...
东莞推广网站排名/网站制作策划
一、多重共线性及其危害我有一组自变量:它们满足下列关系:那么我们称这四个变量间存在多重共线性。这就意味着,一个变量可以被另外几个变量来解释,这就会带来两个后果1、尽管系数估计的无偏性没有收到影响,但是不幸的是…...
东莞网站推广优化/2345网址导航
cygwin的下的gcc的一点体会。1,源文件的扩展名为c,按C的规则编译;源文件的扩展名为cpp,按C的规则编译。注意:两者默认包括的文件也不同。2,gcc -o hello hello.o 按c方式生成exe。g -o hello hello.o 方式生成exe。c方…...
做自己的网站需要会编程吗/新闻发布
修改图片的大小 点击图像,图像大小 本文转自 烂泥行天下 51CTO博客,原文链接:http://blog.51cto.com/ilanni/580885...
网站优化建设/水果营销软文
开头 这个世界都是并发的,编程里更是这样,俗话说:并发知识大,一口吃不下。想成为一名优秀的 Java 开发,学好并发,绝对是你走入高薪行列的必备能力之一。 并发涉及的知识点,其实十分琐碎。学完…...
有什么做服装的网站吗/企业网站的作用有哪些
SecureCRT可以使用zmodem协议来快速的传送文件,使用非常方便。对于Linux系统,大多数发行版本都自带有rz和sz命令。在SecureCRT中选择Options->Session Options->Xmodem/Zmodem,即可以设置相应的上传和下载目录。在使用SecureCRT登陆lin…...