Linux高并发服务器开发(十一)UDP通信和本地socket通信

文章目录

  • 1 TCP和UDP的区别
  • 2 UDP
    • API
    • 流程
      • 服务端流程
      • 客户端流程
    • 代码
      • 服务端
      • 客户端
  • 3 本地socket通信
    • 服务端
    • 客户端
    • 客户端代码


1 TCP和UDP的区别

在这里插入图片描述

2 UDP

API

在这里插入图片描述

在这里插入图片描述

流程

服务端流程

在这里插入图片描述
在这里插入图片描述

客户端流程

在这里插入图片描述

代码

服务端

#include<sys/socket.h>
#include<stdio.h>
#include<arpa/inet.h>
#include <unistd.h>
#include<sys/time.h>
#include<sys/types.h>
#include<sys/select.h>
#include<sys/epoll.h>
#include <fcntl.h>
#include <strings.h>
#include <string.h>
#include <ctype.h>int main()
{// 创建套接字int cfd = socket(AF_INET,SOCK_DGRAM,0);if(cfd<0){perror("socket error");return -1;}// 绑定struct sockaddr_in serv;struct sockaddr_in client;bzero(&serv, sizeof(serv));serv.sin_family = AF_INET;serv.sin_port = htons(8888);serv.sin_addr.s_addr = htonl(INADDR_ANY);bind(cfd,(struct sockaddr*)&serv,sizeof(serv));// while中收发数据int n;socklen_t len;char buf[1024] = "";while(1){memset(buf,0x00,sizeof(buf));len = sizeof(client);n = recvfrom(cfd, buf, sizeof(buf),0,(struct sockaddr*)&client, &len);// 将大写转换为小写for(int i=0;i<n;i++){buf[i] = toupper(buf[i]);}sendto(cfd,buf,n,0, (struct sockaddr*) &client, len);}close(cfd);return 0;
}

客户端

#include<sys/socket.h>
#include<stdio.h>
#include<arpa/inet.h>
#include <unistd.h>
#include<sys/time.h>
#include<sys/types.h>
#include<sys/select.h>
#include<sys/epoll.h>
#include <fcntl.h>
#include <strings.h>
#include <string.h>
#include <ctype.h>int main()
{// 创建套接字int cfd = socket(AF_INET,SOCK_DGRAM,0);if(cfd<0){perror("socket error");return -1;}// while中收发数据int n;socklen_t len;char buf[1024] = "";struct sockaddr_in serv;serv.sin_family = AF_INET;serv.sin_port = htons(8888);inet_pton(AF_INET,"127.0.0.1",&serv.sin_addr.s_addr);while(1){// 读标准输入数据memset(buf, 0x00, sizeof(buf));n = read(STDIN_FILENO,buf,sizeof(buf));// 发送数据sendto(cfd,buf,n,0, (struct sockaddr*) &serv, sizeof(serv));memset(buf,0x00,sizeof(buf));// 接受数据n = recvfrom(cfd, buf, sizeof(buf),0,NULL, NULL);printf("n = [%d], buf = [%s]\n",n,buf);}close(cfd);return 0;
}

3 本地socket通信

在这里插入图片描述
创建成功后,会在内核中创建缓冲区

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
流程
在这里插入图片描述

服务端

在这里插入图片描述

#include<sys/socket.h>
#include<stdio.h>
#include<arpa/inet.h>
#include <unistd.h>
#include<sys/types.h>
#include <fcntl.h>
#include <strings.h>
#include <string.h>
#include <ctype.h>
#include <sys/un.h>int main()
{// 创建socketint lfd = socket(AF_UNIX, SOCK_STREAM, 0);if(lfd<0){perror("socket error");return 1;}// 删除 serv.sock文件unlink("serv.sock");// 绑定struct sockaddr_un serv;serv.sun_family = AF_UNIX;strcpy(serv.sun_path, "./serv.sock");int ret = bind(lfd, (struct sockaddr*)&serv,sizeof(serv));if(ret < 0){perror("bind");return 1;}// 监听listen(lfd,128);// 接受新的客户端连接struct sockaddr_un client;socklen_t len = sizeof(client);int cfd = accept(lfd, (struct sockaddr*)&client, &len);if(cfd < 0){perror("accpet error");return -1;}int n;int i;char buf[1024];while(1){memset(buf, 0x00, sizeof(buf));// 读数据n = read(cfd, buf, sizeof(buf));if(n<=0){printf("read error or  client clsoe");break;}// 发送数据for(i = 0;i<n;i++){buf[i] = toupper(buf[i]);}write(cfd,buf,n);}close(cfd);close(lfd);return 0;}

客户端

在这里插入图片描述

客户端代码

#include<sys/socket.h>
#include<stdio.h>
#include<arpa/inet.h>
#include <unistd.h>
#include<sys/types.h>
#include <fcntl.h>
#include <strings.h>
#include <string.h>
#include <ctype.h>
#include <sys/un.h>int main()
{// 创建socketint cfd = socket(AF_UNIX, SOCK_STREAM, 0);if(cfd<0){perror("socket error");return 1;}// 连接服务端struct sockaddr_un serv;serv.sun_family = AF_UNIX;strcpy(serv.sun_path, "./serv.sock");connect(cfd, (struct sockaddr*)&serv, sizeof(serv));int n;int i;char buf[1024];while(1){memset(buf, 0x00, sizeof(buf));n = read(STDIN_FILENO, buf, sizeof(buf));// 发送数据write(cfd,buf,n);// 读数据memset(buf, 0x00, sizeof(buf));n = read(cfd, buf, sizeof(buf));if(n<=0){printf("read error or  client clsoe");break;}}close(cfd);return 0;}

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

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

相关文章

二叉树与堆相关的时间复杂度问题

目录 满二叉树与完全二叉树高度h和树中节点个数N的关系 向上调整算法&#xff1a; 介绍&#xff1a; 复杂度推导&#xff1a; 向下调整算法&#xff1a; 介绍&#xff1a; 复杂度推导&#xff1a; 向上调整建堆&#xff1a; 介绍&#xff1a; 复杂度推导&#xff1a;…

Redis 集群 三主三从 主节点之间数据不会同步说明

Redis 集群中有一个特性&#xff0c;它不使用强一致性模型&#xff0c;而是使用最终一致性。Redis 集群通过分区 (sharding) 的方式来存储数据&#xff0c;不同的键可能会被存储在不同的节点上。每个键通过一个哈希槽 (hash slot) 来决定应该被存储到哪个节点上。一个 Redis 集…

Java中怎么使用httpclick发送application/x-www-form-urlencoded请求并接收text/xml数据呢?

项目中遇到一个请求方式要求&#xff1a; 1 、POST 请求 2 、Content-Type: text/xml; charsetutf-8 项目是Java代码 使用的httpclick发送的请求&#xff0c;接下来让我看下如何实现&#xff0c;本部分只提供核心请求代码&#xff0c;之前分享过httpclick发送请求工具类&…

CPU的核心数和线程数

CPU的核心数和线程数 一、关系&#xff1a; 1、线程数可以模拟出不同的CPU核心数。 CPU的核心数指的是硬件上存在着几个核心&#xff0c;而线程数可以模拟出多个核心数的功能。线程数越多&#xff0c;越有利于同时运行多个程序&#xff0c;因为线程数等同于在某个瞬间CPU能同…

【C++】POCO学习总结(二十):交叉编译poco-1.12.5p2

1、版本说明 1.1 poco-1.13 截止2024-07-03&#xff0c;POCO的稳定版本最高为poco-1.13.3&#xff0c;注意从poco-13.0开始需要编译器支持C17&#xff0c;否则编译时报错。 常见报错有&#xff1a; 1&#xff09;std::string的append重载版本问题&#xff0c;报错信息如下 …

Golang 基于 archive/zip 包实现文件

这里写自定义目录标题 摘要引言Go语言简介archive/zip 包概述&#xff1a;环境准备基础概念&#xff1a;压缩的基本概念&#xff1a;解压缩的基本概念&#xff1a;ZIP格式的特点&#xff1a;ZIP文件的组成&#xff1a;使用ZIP的优点&#xff1a; 使用 archive/zip 包进行文件压…

利用Arcgis绘制克吕金插值图

工作中我们常用到克吕金插值图&#xff0c;下面简单介绍下使用Arcmap绘制克吕金插值图的方法及注意事项&#xff0c;希望能帮到大家。 一、准备工作 软件&#xff1a;Arcgis 数据&#xff1a;点图层、研究范围 二、操作步骤 1 添加数据 打开Arcmap&#xff0c;从添加位置将…

WIN32核心编程 - 进程操作(二) 遍历进程 - 进程通信

公开视频 -> 链接点击跳转公开课程博客首页 -> 链接点击跳转博客主页 目录 遍历进程 CreateToolhelp32Snapshot EnumProcesses NtQuerySystemInformation 进程通信 clipboard FileMapping NamedPipe Mailslot 遍历进程 CreateToolhelp32Snapshot #include &l…

JAVA数字化产科管理平台源码:涵盖了孕妇从建档、产检、保健、随访、分娩到产后42天全流程的信息化管理

JAVA数字化产科管理平台源码&#xff1a;涵盖了孕妇从建档、产检、保健、随访、分娩到产后42天全流程的信息化管理 智慧产科管理系统是基于自主研发妇幼信息平台&#xff0c;为医院产科量身打造的信息管理系统&#xff0c;涵盖了孕妇从建档、产检、保健、随访、分娩到产后42天全…

Go语言实现的端口扫描工具示例

Go语言实现的端口扫描工具示例 创建一个端口扫描工具涉及到网络编程和并发处理&#xff0c;下面是一个简单的Go语言实现的端口扫描工具示例。这个工具会扫描指定IP地址的指定范围内的端口。 请注意&#xff0c;使用端口扫描工具可能会违反某些网络的使用条款&#xff0c;甚至…

企商在线出席2024全球数字经济大会城市副中心论坛

2024年7月3日&#xff0c;2024全球数字经济大会城市副中心论坛“数字基础设施绿色创新发展分论坛”在北京市通州区成功举办。企商在线产品及解决方案总监孙杰受邀出席本次会议&#xff0c;并参与圆桌对话环节&#xff0c;分享“绿色”发展思路与经验。 2024全球数字经济大会城市…

FFMpeg rtmp 无压缩推送本地yuv文件 压缩推送本地yuv文件

可以借鉴的&#xff1a;C使用FFmpeg实现YUV数据编码转视频文件_C 语言_脚本之家 yuv文件下载地址&#xff1a;YUV Sequences 无压缩的方式推送本地yuv文件 代码&#xff1a; #include <stdio.h> #include <unistd.h> #include <iostream> extern "C&…

【代码随想录02】977.有序数组的平方 209.长度最小的子数组 59.螺旋矩阵II

977. 有序数组的平方 题目描述 给你一个按 非递减顺序 排序的整数数组 nums&#xff0c;返回 每个数字的平方 组成的新数组&#xff0c;要求也按 非递减顺序 排序。 做题思路 由于原数组存在负数&#xff0c;所以平方后最大值可能出现在两端。因此可以采用双指针法&#xf…

身边有填报志愿需求别错过!张雪峰透露今年志愿填报技巧:报专业,别报行业!(文末附稳定高薪专业推荐)

高考填报志愿是每个考生和家长都要面对的重大抉择。在当前就业形势日趋严峻、部分行业发展前景不明朗的大背景下,考生在填报志愿时更需要全面了解各个专业的就业前景,理性权衡自身兴趣特长与社会需求&#xff0c;而不是盲目跟风报考所谓的"热门专业"。 今天跟大家分…

期权开户零门槛怎么操作?期权不满50w的开户方式

今天带你了解期权开户零门槛怎么操作&#xff1f;期权不满50w的开户方式。在股票期权市场上&#xff0c;期权交易是一种非常受欢迎的投资方式。它不仅可以增加投资组合的多样性&#xff0c;还可以为投资者提供一定的保护和利润机会&#xff0c;比如通过买入认股期权做空对冲大盘…

如何选择视频号矩阵系统:打造高效短视频内容生态的指南

在短视频内容创作和分发的热潮中&#xff0c;视频号矩阵系统作为一种高效的管理工具&#xff0c;受到了越来越多创作者和品牌的青睐。它通过集中管理多个视频号&#xff0c;优化内容发布流程&#xff0c;帮助用户提升工作效率和内容影响力。本文将探讨如何选择一个合适的视频号…

振弦采集仪的工程安全监测实践与案例分析

振弦采集仪的工程安全监测实践与案例分析 振弦采集仪是一种常用的工程安全监测仪器&#xff0c;通过测量被监测结构的振动频率与振型&#xff0c;可以实时监测结构的安全状况。本文将结合实践经验和案例分析&#xff0c;探讨振弦采集仪在工程安全监测中的应用。 一&#xff0c…

欢乐钓鱼大师游戏攻略:在什么地方掉称号鱼?云手机游戏辅助!

《欢乐钓鱼大师》是一款融合了休闲娱乐和策略挑战的钓鱼游戏。游戏中的各种鱼类不仅各具特色&#xff0c;而且钓鱼过程充满了挑战和乐趣。下面将为大家详细介绍如何在游戏中钓鱼&#xff0c;以及一些有效的钓鱼技巧&#xff0c;帮助你成为一个出色的钓鱼大师。 实用工具推荐 为…

io_contextttttttttttt

创建上下文——io_context_t 它是一个上下文结构&#xff0c;在内部它包含一个完成队列&#xff0c;在线程之间是可以共享的。 提交请求——iocb io回调数据结构&#xff0c;和io_submit配合使用。 处理结果 通过io_event处理结果&#xff0c; struct io_event {void *data…

搜狗输入法产品使用说明

搜狗输入法产品使用说明 (qq.com) 看这里&#xff0c;这里记录下。基本都用这个&#xff0c;里面还是有很多小技巧不知道&#xff0c;可以参考下。