网络编程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的环境配置,设置好相应的目录 新…...
ChatGPT API调用实战:从基础接入到生产环境优化指南
ChatGPT API调用实战:从基础接入到生产环境优化指南 作为一名开发者,在将ChatGPT这类强大的AI能力集成到自己应用中的过程中,我踩过不少坑。从最初的简单请求,到后来面对高并发、长对话、成本控制等生产级挑战,整个过…...
专业级实时屏幕翻译工具深度解析:5大实战技巧提升工作效率
专业级实时屏幕翻译工具深度解析:5大实战技巧提升工作效率 【免费下载链接】Translumo Advanced real-time screen translator for games, hardcoded subtitles in videos, static text and etc. 项目地址: https://gitcode.com/gh_mirrors/tr/Translumo Tra…...
OpenClaw跨平台测试:Qwen3-VL:30B在Mac/Win/Linux飞书表现
OpenClaw跨平台测试:Qwen3-VL:30B在Mac/Win/Linux飞书表现 1. 测试背景与动机 去年12月接手团队自动化工具选型时,我们遇到了一个典型困境:团队成员分别使用macOS、Windows和Ubuntu系统,但现有AI助手工具要么绑定特定平台&#…...
深度解析开源工具如何实现游戏性能优化:Genshin FPS Unlocker专业实战指南
深度解析开源工具如何实现游戏性能优化:Genshin FPS Unlocker专业实战指南 【免费下载链接】genshin-fps-unlock unlocks the 60 fps cap 项目地址: https://gitcode.com/gh_mirrors/ge/genshin-fps-unlock Genshin FPS Unlocker 是一款专注于游戏性能优化的…...
XUnity.AutoTranslator IL2CPP兼容性深度解析:从诊断到根治的终极指南
XUnity.AutoTranslator IL2CPP兼容性深度解析:从诊断到根治的终极指南 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator XUnity.AutoTranslator作为Unity游戏自动翻译的标杆工具,在5…...
AI训练师真实收入全景图:软件测试员的蓝海突围指南
一、薪资迷雾:从“月入六万神话”到基层现实2026年AI训练师岗位呈现极端薪资分化,需穿透表象看本质:头部光环案例:大厂高阶岗位(如AI伦理设计师、大模型优化专家)年薪可达60-100万元,但通常要求…...
清音刻墨Qwen3快速上手:拖拽上传,自动生成,一键下载
清音刻墨Qwen3快速上手:拖拽上传,自动生成,一键下载 1. 为什么选择清音刻墨Qwen3? 视频字幕制作一直是内容创作者的痛点。传统方法要么需要逐字听写,要么使用普通语音识别工具生成文字后,还得手动调整时间…...
VSCode便携版:如何实现真正的跨设备开发自由?
VSCode便携版:如何实现真正的跨设备开发自由? 【免费下载链接】VSCode-Portable VSCode 便携版 VSCode Portable 项目地址: https://gitcode.com/gh_mirrors/vsc/VSCode-Portable 还在为不同电脑上开发环境不一致而烦恼吗?VSCode便携版…...
OpenClaw故障排查:Qwen3-VL:30B飞书连接常见问题解决
OpenClaw故障排查:Qwen3-VL:30B飞书连接常见问题解决 1. 问题背景与排查准备 上周在星图平台部署Qwen3-VL:30B时,我遇到了OpenClaw与飞书连接的一系列"诡异"问题。从WebSocket莫名断开到模型响应超时,整个过程就像在解一个技术版…...
CAN总线故障诊断与维修全指南
经典CAN总线现场故障分析与诊断指南1. CAN总线故障概述1.1 常见故障现象当CAN总线系统出现传输异常时,通常会表现为多种复合故障现象,包括但不限于:仪表板显示异常车辆启动/熄火功能失效动力系统性能下降特定电控模块功能丧失这些现象的根本原…...
