网络编程day04(网络属性函数、广播、组播、TCP并发)
今日任务

对于newfd的话,最好是另存然后传入给分支线程,避免父子线程操作同一个文件描述符
------------在tcp多线程服务端----------
如果使用全局变量,或者指针方式间接访问,会导致所有线程共用一份newfd和cin,那么newfd和cin会被覆盖
1.广播:
接收端
代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>#define ERR_MSG(msg) do{\perror(msg);\fprintf(stderr,"__%d__",__LINE__);\
}while(0)
#define IP "192.168.125.255"
#define PORT 8888
/** function: 广播,接收方* @param [ in] * @param [out] * @return */int main(int argc, const char *argv[])
{//创建报式套接字int sfd=socket(AF_INET,SOCK_DGRAM,0);if(sfd<0){ERR_MSG("socket");return -1;}puts("socket success");//绑定IIF(P和端口号(广播ip)struct sockaddr_in addr;addr.sin_family=AF_INET;addr.sin_port=htons(PORT);addr.sin_addr.s_addr=inet_addr(IP);socklen_t addrlen=sizeof(addr);if(bind(sfd,(struct sockaddr*)&addr,addrlen)<0){ERR_MSG("bind");}puts("bind success");//存储发送方地址消息struct sockaddr_in source_addr;socklen_t source_addrlen=sizeof(source_addr);//循环接受消息char buf[128]="";while(1){bzero(buf,sizeof(buf));int recv_res=recvfrom(sfd,&buf,sizeof(buf),0,(struct sockaddr*)&source_addr,&source_addrlen);if(recv_res<0){ERR_MSG("recvfrom");return -1;}puts("recvfrom success");printf("[%s:%d]:%s\n",inet_ntoa(source_addr.sin_addr),ntohs(source_addr.sin_port),buf);}//关闭close(sfd);return 0;
}
发送端
代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>#define ERR_MSG(msg) do{\perror(msg);\fprintf(stderr,"__%d__",__LINE__);\
}while(0)
#define IP "192.168.125.255"
#define PORT 8888
/** function: 广播,发送方* @param [ in] * @param [out] * @return */int main(int argc, const char *argv[])
{//创建报式套接字int sfd=socket(AF_INET,SOCK_DGRAM,0);if(sfd<0){ERR_MSG("socket");return -1;}puts("socket success");//设置允许广播int optval=1;//非0为允许socklen_t optlen=sizeof(optval);if(setsockopt(sfd,SOL_SOCKET,SO_BROADCAST,&optval,optlen)<0){ERR_MSG("setsockopt");return -1;}//IP和端口号(广播ip)struct sockaddr_in addr;addr.sin_family=AF_INET;addr.sin_port=htons(PORT);addr.sin_addr.s_addr=inet_addr(IP);socklen_t addrlen=sizeof(addr);//循环发送消息char buf[128]="";while(1){bzero(buf,sizeof(buf));printf("请输入>>>");fgets(buf,sizeof(buf),stdin);buf[strlen(buf)-1]='\0';if(sendto(sfd,buf,sizeof(buf),0,(struct sockaddr*)&addr,addrlen)<0){ERR_MSG("sendto");return -1;}puts("sendto success");}//关闭close(sfd);return 0;
}
2.组播
接收端
代码:
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <unistd.h>
#include <string.h>#define ERR_MSG(msg) do{\perror(msg);\fprintf(stderr,"__%d__",__LINE__);\
}while(0)
#define IP "192.168.125.2"
#define PORT 8888
#define GRP_IP "224.1.2.3"
/** function: 组播:接收方* @param [ in] * @param [out] * @return */
int main(int argc, const char *argv[])
{//创建报式套接字int sfd=socket(AF_INET,SOCK_DGRAM,0);if(sfd<0){ERR_MSG("socket");return -1;}puts("socket success");//加入多播组struct ip_mreqn mq;mq.imr_multiaddr.s_addr = inet_addr(GRP_IP); //组播IPmq.imr_address.s_addr = inet_addr(IP); //本机IP,ifconfigmq.imr_ifindex = 2; //网络设备索引号if(setsockopt(sfd,IPPROTO_IP, IP_ADD_MEMBERSHIP,&mq,sizeof(mq))<0){ERR_MSG("setsockopt");return -1;}//绑定IIF(P和端口号(广播ip)struct sockaddr_in addr;addr.sin_family=AF_INET;addr.sin_port=htons(PORT);addr.sin_addr.s_addr=inet_addr(GRP_IP);socklen_t addrlen=sizeof(addr);if(bind(sfd,(struct sockaddr*)&addr,addrlen)<0){ERR_MSG("bind");}puts("bind success");//接受对方地址信息struct sockaddr_in source_addr;socklen_t source_addrlen=sizeof(source_addr);char buf[128]="";while(1){//接收消息bzero(buf,sizeof(buf));int recv_res = recvfrom(sfd, buf, sizeof(buf), 0, (struct sockaddr*)&source_addr, &source_addrlen);if(recv_res < 0){ERR_MSG("recvfrom");return -1;}printf("[%s:%d] : %s\n", \inet_ntoa(source_addr.sin_addr), ntohs(source_addr.sin_port), buf);}//关闭close(sfd);return 0;
}
发送端
代码
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <unistd.h>
#include <string.h>#define ERR_MSG(msg) do{\perror(msg);\fprintf(stderr,"__%d__",__LINE__);\
}while(0)
#define IP "192.168.125.2"
#define PORT 8888
#define GRP_IP "224.1.2.3"
/** function: 组播:发送方* @param [ in] * @param [out] * @return */
int main(int argc, const char *argv[])
{//创建报式套接字int sfd=socket(AF_INET,SOCK_DGRAM,0);if(sfd<0){ERR_MSG("socket");return -1;}puts("socket success");//绑定IIF(P和端口号(广播ip)struct sockaddr_in addr;addr.sin_family=AF_INET;addr.sin_port=htons(PORT);addr.sin_addr.s_addr=inet_addr(GRP_IP);socklen_t addrlen=sizeof(addr);if(bind(sfd,(struct sockaddr*)&addr,addrlen)<0){ERR_MSG("bind");}puts("bind success");char buf[128]="";while(1){//发送消息bzero(buf,sizeof(buf));printf("请输入>>> ");fgets(buf, sizeof(buf), stdin);buf[strlen(buf)-1] = 0;//发送数据, 主动发送给指定接收放,例如这里可以主动发给接收方if(sendto(sfd, buf, sizeof(buf), 0, (struct sockaddr*)&addr, sizeof(addr)) < 0){ERR_MSG("sendto");return -1;}printf("sendto success\n");}//关闭close(sfd);return 0;
}
3.TCP并发
多进程
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <sys/wait.h>
//自定义报错提示
#define ERR_MSG(msg) do{\fprintf(stderr,"__%d__",__LINE__);\perror(msg);\
}while(0)
#define SER_PORT 8888
#define SER_IP "192.168.125.2"
/** function: TCP服务端* @param [ in] * @param [out] * @return */int recv_send(int cfd,struct sockaddr_in cli_addr);
void handle(int sig){while(waitpid(-1,NULL,WNOHANG)>0);return ;
}int main(int argc, const char *argv[])
{//监听回收僵尸进程if(signal(SIGCHLD,handle)==SIG_ERR){ERR_MSG("signal");return -1;}//1.创建socket套接字,int sfd=socket(AF_INET,SOCK_STREAM,0);if(sfd<0){ERR_MSG("socket");return -1;}puts("socket create");//允许端口快速复用int reuse = 1;if(setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) < 0){ERR_MSG("setsockopt");return -1;}printf("允许端口快速复用成功\n");//2.绑定服务器IP和端口号bindstruct sockaddr_in addr;addr.sin_family=AF_INET;addr.sin_port=htons(SER_PORT);addr.sin_addr.s_addr=inet_addr(SER_IP);if(bind(sfd,(struct sockaddr*)&addr,sizeof(addr))<0){ERR_MSG("bind");return -1;}puts("bind success");//3.建立监听listenif(listen(sfd,128)<0){ERR_MSG("listen");return -1;}puts("listen suucess");//4.等待客户端连接, acceptstruct sockaddr_in cli_addr;socklen_t cli_addrlen=sizeof(cli_addr);pid_t pid;while(1){int cfd=accept(sfd,(struct sockaddr*)&cli_addr,&cli_addrlen);if(cfd<0){ERR_MSG("accept");return -1;}puts("accept");pid=fork();if(pid==0){//子进程执行信息收发recv_send(cfd,cli_addr);exit(0);}else if(pid<0){ERR_MSG("fork");return -1;}close(cfd);}//6.关闭close(sfd);return 0;
}
int recv_send(int cfd,struct sockaddr_in cli_addr){//5.接受发送消息recv;sendchar buf[128];while(1){bzero(buf,sizeof(buf));int recv_res=recv(cfd,buf,sizeof(buf),0);if(recv_res<0){ERR_MSG("recv");return -1;}else if(recv_res==0){printf("socket peer has shutdown\n");break;}puts("recv success");printf("[%s:%d]:%s\n",inet_ntoa(cli_addr.sin_addr),ntohs(cli_addr.sin_port),buf);if(strcmp(buf,"quit")==0)break;strcat(buf,"-----i has received");int send_res=send(cfd,buf,sizeof(buf),0);if(send_res<0){ERR_MSG("send");return -1;}puts("send success");}
}
多线程
代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <pthread.h>//自定义报错提示
#define ERR_MSG(msg) do{\fprintf(stderr,"__%d__",__LINE__);\perror(msg);\
}while(0)
#define SER_PORT 8888
#define SER_IP "192.168.125.2"
struct cliMsg{int cfd;struct sockaddr_in cli_addr;
};
/** function: TCP服务端* @param [ in] * @param [out] * @return */
void* recv_send(void*arg);
int main(int argc, const char *argv[])
{//1.创建socket套接字,int sfd=socket(AF_INET,SOCK_STREAM,0);if(sfd<0){ERR_MSG("socket");return -1;}puts("socket create");//允许端口快速复用int reuse = 1;if(setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) < 0){ERR_MSG("setsockopt");return -1;}printf("允许端口快速复用成功\n");//2.绑定服务器IP和端口号bindstruct sockaddr_in addr;addr.sin_family=AF_INET;addr.sin_port=htons(SER_PORT);addr.sin_addr.s_addr=inet_addr(SER_IP);if(bind(sfd,(struct sockaddr*)&addr,sizeof(addr))<0){ERR_MSG("bind");return -1;}puts("bind success");//3.建立监听listenif(listen(sfd,128)<0){ERR_MSG("listen");return -1;}puts("listen suucess");//4.等待客户端连接, acceptstruct sockaddr_in cli_addr;socklen_t cli_addrlen=sizeof(cli_addr);pthread_t pth;while(1){int cfd=accept(sfd,(struct sockaddr*)&cli_addr,&cli_addrlen);if(cfd<0){ERR_MSG("accept");return -1;}puts("accept");struct cliMsg climsg;climsg.cfd=cfd;climsg.cli_addr=cli_addr;//创建调用线程执行if(pthread_create(&pth,NULL,recv_send,(void *)&climsg)!=0){fprintf(stderr,"pthread_create failed __%d__\n",__LINE__);return -1;}pthread_detach(pth);}close(sfd);return 0;
}
void* recv_send(void*arg){//5.接受发送消息recv;sendint cfd=((struct cliMsg*)arg)->cfd;struct sockaddr_in cli_addr=((struct cliMsg*)arg)->cli_addr;char buf[128];while(1){bzero(buf,sizeof(buf));int recv_res=recv(cfd,buf,sizeof(buf),0);if(recv_res<0){ERR_MSG("recv");break;}else if(recv_res==0){printf("socket peer has shutdown\n");break;}puts("recv success");printf("[%s:%d]:%s\n",inet_ntoa(cli_addr.sin_addr),ntohs(cli_addr.sin_port),buf);if(strcmp(buf,"quit")==0)break;strcat(buf,"-----i has received");int send_res=send(cfd,buf,sizeof(buf),0);if(send_res<0){ERR_MSG("send");break;}puts("send success");}close(cfd);pthread_exit(NULL);
}
今日思维导图

不知道最近确实是脑子比较慢,还是拖拉,做事太慢了,tcp的代码还没复敲;
相关文章:
网络编程day04(网络属性函数、广播、组播、TCP并发)
今日任务 对于newfd的话,最好是另存然后传入给分支线程,避免父子线程操作同一个文件描述符 ------------在tcp多线程服务端---------- 如果使用全局变量,或者指针方式间接访问,会导致所有线程共用一份newfd和cin,那么…...
HALCON支持GPU加速的算子有哪些?
参考例程get_operator_info。 get_opencl_operators这里可以查看到所有支持gpu加速的算子。 支持的算子列表: crop_rectangle1,deviation_image,mean_image,points_harris,gray_opening_shape, gray_dilat…...
MacBook Pro 电池电量限制充电怎么设置AlDente Pro for Mac最大充电限制工具
通过充电电量限制工具可以更好的保护MacBook Pro的电池,通过 AlDente Pro 您可以设置电池的最大充电百分比设置为 20% 至 100%,然后,它将保持在所需的电池百分比,然后再次使用电源适配器进行充电。 AlDent…...
毕业设计选题之Java+springboot线上蔬菜销售与配送系统(源码+调试+开题+lw)
💕💕作者:计算机源码社 💕💕个人简介:本人七年开发经验,擅长Java、Python、PHP、.NET、微信小程序、爬虫、大数据等,大家有这一块的问题可以一起交流! 💕&…...
【Leetcode】162.寻找峰值
一、题目 1、题目描述 峰值元素是指其值严格大于左右相邻值的元素。 给你一个整数数组 nums,找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回 任何一个峰值 所在位置即可。 你可以假设 nums[-1] = nums[n] = -∞ 。 你必须实现时间复杂度为 O(log n…...
SpringBoot集成MinIO8.0
一、安装MinIO 中文官网地址:https://www.minio.org.cn/download.shtml 官网地址:https://min.io/download 官网有相应的安装命令,可查看 建议引用相应版本的依赖 二、集成SpringBoot 1.引入依赖 <dependency><groupId>io.…...
蓝桥等考Python组别五级007
第一部分:选择题 1、Python L5 (15分) 表达式“not a > 0”等价于下面哪个表达式?( ) a < 0a == 0a <= 0a in 0正确答案:C 2、Python L5 (15分) 执行下面的程序,当用键盘输入10时,输出结果是( )。 n &...
【装机】通过快捷键设置BIOS从U盘启动
当要重装系统的时候,是否会遇到一个问题,进入bios的时候就开始凌乱了,因为不懂得怎么用bios设置u盘启动.不要着急,下面来一波小白装机教程 总的来讲,设置电脑从U盘启动一共有两种方法: 第一种:开机时候按快捷键,然后选择U盘启动第…...
关于操作系统与内核科普
关于操作系统与内核科普 一.什么是操作系统 操作系统是管理计算机硬件与软件资源的计算机程序。它为计算机硬件和软件提供了一种中间层。 操作系统是一种软件,主要目的有三种: 一.管理计算机资源,这些资源包括CPU,内存࿰…...
算法练习3——删除有序数组中的重复项
LeetCode 26 删除有序数组中的重复项 给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。 考虑 nums …...
《YOLOv5:从入门到实战》报错解决 专栏答疑
前言:Hello大家好,我是小哥谈。《YOLOv5:从入门到实战》专栏上线后,部分同学在学习过程中提出了一些问题,笔者相信这些问题其他同学也有可能遇到。为了让大家可以更好地学习本专栏内容,笔者特意推出了该篇专…...
[2023.09.25]:Rust编写基于web_sys的编辑器:输入光标再次定位的小结
前些天,写了探索Rust编写基于web_sys的WebAssembly编辑器:挑战输入光标定位的实践,经过后续的开发检验,我发现了一个问题,就是光标消失了。为了继续输入,用户需要再次使用鼠标点击。现在我已经弄清楚了导致…...
估计、偏差和方差
一、介绍 统计领域为我们提供了很多工具来实现机器学习目标,不仅可以解决训练集上的任务,还可以泛化。基本的概念,例如参数估计、偏差和方差,对于正式地刻画泛化、欠拟合和过拟合都非常有帮助。 二、参数估计 参数估计 是统计学…...
正态分布的概率密度函数|正态分布检验|Q-Q图
正态分布的概率密度函数(Probability Density Function,简称PDF)的函数取值是指在给定的正态分布参数(均值 μ 和标准差 σ)下,对于特定的随机变量取值 x,计算得到的概率密度值 f(x)。这个值表示…...
【接口测试】HTTP协议
一、HTTP 协议基础 HTTP 简介 HTTP 是一个客户端终端(用户)和服务器端(网站)请求和应答的标准(TCP)。通常是由客户端发起一个请求,创建一个到服务器的 TCP 连接,当服务器监听到客户…...
【重新定义matlab强大系列十四】基于问题求解有/无约束非线性优化
🔗 运行环境:Matlab 🚩 撰写作者:左手の明天 🥇 精选专栏:《python》 🔥 推荐专栏:《算法研究》 #### 防伪水印——左手の明天 #### 💗 大家好🤗ᾑ…...
MySQL 索引介绍和最佳实践
目录 一、前言二、索引类型1.1 主键索引(PRIMARY KEY)1.2 唯一索引(UNIQUE)1.3 普通索引(NORMAL)1.3.1 单列普通索引1.3.2 单列前缀普通索引1.3.3 多列普通索引1.3.4 多列前缀普通索引 1.4 空间索引&#x…...
区块链(7):p2p去中心化之初始化websoket服务端
1 整个流程梳理 服务开启onStart()连接打开onOpen()处理接收到的消息onMesage()连接关闭onClose()异常处理onError()2 创建p2p实现类 package com.example.demo.service;import com.example.demo.entity.BlockChain; import org.java_websocket.WebSocket; import org.java_we…...
原型、原型链、判断数据类型
目录 作用 原型链 引用类型:__proto__(隐式原型)属性,属性值是对象函数:prototype(原型)属性,属性值是对象 Function:本身也是函数 相关方法 person.prototype.isPrototypeOf(stu) Object.getPrototypeOf(objec…...
pycharm中配置torch
在控制台cmd中安装好torch后,在pycharm中使用torch,需要进行简单设置即可。 在pycharm中新建一个工程,在file文件中打开setting 在setting中找到project interpreter编译器 找到conda environment的环境配置,设置好相应的目录 新…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...
第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...
蓝桥杯 冶炼金属
原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...
CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...
PAN/FPN
import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...
AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机
这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机,因为在使用过程中发现 Airsim 对外部监控相机的描述模糊,而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置,最后在源码示例中找到了,所以感…...
MeshGPT 笔记
[2311.15475] MeshGPT: Generating Triangle Meshes with Decoder-Only Transformers https://library.scholarcy.com/try 真正意义上的AI生成三维模型MESHGPT来袭!_哔哩哔哩_bilibili GitHub - lucidrains/meshgpt-pytorch: Implementation of MeshGPT, SOTA Me…...
