用进程和线程完成TCP进行通信操作及广播和组播的通信
进程
代码
#include <stdio.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <string.h>#include <unistd.h>#include <stdlib.h>#include <signal.h>#include <sys/wait.h>#define PORT 8888#define IP "192.168.124.62" #define ERR_MSG(msg) do{\fprintf(stderr,"line=%d",__LINE__);\perror(msg);\}while(0)void handler(int sig){while(waitpid(-1,NULL,WNOHANG)>0);}int main(int argc, const char *argv[]){//创建套接字int fd = socket(AF_INET,SOCK_STREAM,0);if(fd<0){ERR_MSG("socket");return -1;}printf("-流式套接字\n");//捕获17号信息SIGCHLDif(signal(17,handler) == SIG_ERR){ERR_MSG("signal");return -1;}//允许端口号重复使用int reuse = 1;if(setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse))<0){ERR_MSG("setsockopt");return -1;}printf("端口允许快速重用\n");//创建一个地址信息结构体,bind绑定需要用到struct sockaddr_in sin;sin.sin_family = AF_INET;sin.sin_port = htons(PORT);sin.sin_addr.s_addr = inet_addr(IP);//绑定ip和端口if(bind(fd,(struct sockaddr*)&sin,sizeof(sin))<0){ERR_MSG("bind");return -1;}printf("绑定成功\n");//将套接字设置为监听状态if(listen(fd,128)<0){ERR_MSG("listen");return -1;}printf("监听成功\n");int newfd;pid_t pid;struct sockaddr_in cin;socklen_t socklen = sizeof(cin);while(1){//获取连接成功的套接字,用于阻塞等待连接newfd = accept(fd,(struct sockaddr*)&cin,&socklen);if(newfd <0){ERR_MSG("accept");return -1;}printf("[%s:%d]客户端连接成功%d\n",inet_ntoa(sin.sin_addr),ntohs(sin.sin_port),newfd);pid = fork();if(pid == 0){close(fd);//接收与发送char buf[128];ssize_t size;while(1){//接收//bzero(buf,sizeof(buf));//清空数组内容// size = read(newfd,buf,sizeof(buf));size = recv(newfd,buf,sizeof(buf),0);// size = recvfrom(newfd,buf,sizeof(buf),0,NULL,NULL);if(size<0){ERR_MSG("recv");return -1;}else if(size==0){printf("[%s:%d]客户端下线\n",inet_ntoa(sin.sin_addr),ntohs(sin.sin_port));break;}printf("[%s:%d]接收成功newfd=%d:%s\n",inet_ntoa(sin.sin_addr),ntohs(sin.sin_port),newfd,buf);//发送printf("服务器回复>>>>");fgets(buf,sizeof(buf),stdin);buf[strlen(buf)-1] = '\0';if(send(newfd,buf,sizeof(buf),0)<0){ERR_MSG("send");break;}printf("发送成功\n");}close(newfd);exit(0);}close(newfd);}close(fd);return 0;}
运行结果图:
线程
代码:
1 #include <stdio.h>2 #include <sys/types.h>3 #include <sys/socket.h>4 #include <netinet/in.h>5 #include <arpa/inet.h>6 #include <string.h>7 #include <unistd.h>8 #include <stdlib.h>9 #include <signal.h>10 #include <sys/wait.h>11 #include <pthread.h>12 13 #define PORT 888814 #define IP "192.168.124.62"15 #define ERR_MSG(msg) do{\16 fprintf(stderr,"line=%d",__LINE__);\17 perror(msg);\18 }while(0)19 20 struct msg21 {22 int newfd;23 struct sockaddr_in cin;24 };25 void* huidiaolist(void* arg);26 int main(int argc, const char *argv[])27 {28 //创建套接字29 int fd = socket(AF_INET,SOCK_STREAM,0);30 if(fd<0)31 {32 ERR_MSG("socket");33 return -1;34 }35 printf("-流式套接字\n");36 //允许端口号重复使用37 int reuse = 1;38 if(setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse))<0)39 {40 ERR_MSG("setsockopt");41 return -1;42 }43 printf("端口允许快速重用\n");44 //创建一个地址信息结构体,bind绑定需要用到45 struct sockaddr_in sin;46 sin.sin_family = AF_INET;47 sin.sin_port = htons(PORT);48 sin.sin_addr.s_addr = inet_addr(IP);49 //绑定ip和端口50 if(bind(fd,(struct sockaddr*)&sin,sizeof(sin))<0)51 {52 ERR_MSG("bind");53 return -1;54 }55 printf("绑定成功\n");56 57 //将套接字设置为监听状态58 if(listen(fd,128)<0)59 {60 ERR_MSG("listen");61 return -1;62 }63 printf("监听成功\n");64 65 int newfd;66 pid_t pid;67 struct sockaddr_in cin;68 socklen_t socklen = sizeof(cin);69 70 pthread_t tid;71 struct msg clinfo;72 while(1)73 {74 //获取连接成功的套接字,用于阻塞等待连接75 newfd = accept(fd,(struct sockaddr*)&cin,&socklen);76 if(newfd <0)77 {78 ERR_MSG("accept");79 return -1;80 }81 printf("[%s:%d]客户端连接成功%d\n",\82 inet_ntoa(sin.sin_addr),ntohs(sin.sin_port),newfd);83 84 clinfo.newfd = newfd;85 clinfo.cin = cin;86 if(pthread_create(&tid,NULL,huidiaolist,(void*)&clinfo)!=0)87 {88 fprintf(stderr,"line=%d",__LINE__);89 break;90 }91 pthread_detach(tid);92 }93 close(fd);94 95 return 0;96 }97 98 void* huidiaolist(void* arg)99 {
100 //接收与发送
101 int newfd = ((struct msg*)arg)->newfd;
102 struct sockaddr_in cin = ((struct msg*)arg)->cin;
103
104 char buf[128];
105 ssize_t size;
106 while(1)
107 {
108 //接收
109 //
110 bzero(buf,sizeof(buf));//清空数组内容
111 // size = read(newfd,buf,sizeof(buf));
112 size = recv(newfd,buf,sizeof(buf),0);
113 // size = recvfrom(newfd,buf,sizeof(buf),0,NULL,NULL);
114 if(size<0)
115 {
116 ERR_MSG("recv");
117 break;
118 }else if(size==0)
119 {
120 printf("[%s:%d]客户端下线\n",\
121 inet_ntoa(cin.sin_addr),ntohs(cin.sin_port));
122 break;
123 }
124 printf("[%s:%d]接收成功newfd=%d:%s\n",\
125 inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),newfd,buf);
126
127
128 //发送
129 strcpy(buf,"回复");
130 if(send(newfd,buf,sizeof(buf),0)<0)
131 {
132 ERR_MSG("send");
133 break;
134 }
135 printf("发送成功\n");
136 }
137 close(newfd);
138 pthread_exit(NULL);
结果图:
广播
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>
#include <arpa/inet.h>
#include <unistd.h>#define PORT 6667
#define IP "192.168.124.255"
#define ERR_MSG(msg) do{\fprintf(stderr,"line:%d\n",__LINE__);\perror(msg);\
}while(0)int main(int argc, const char *argv[])
{int fd = socket(AF_INET,SOCK_DGRAM,0);if(fd<0){ERR_MSG("scoket");return -1;}printf("创建流式套接字成功cd=%d\n",fd);//允许端口被重int reuse = 1;if(setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse))<0){ERR_MSG("setsockopt");return -1;}printf("允许端口被重复使用\n");//允许广播if(setsockopt(fd,SOL_SOCKET,SO_BROADCAST,&reuse,sizeof(reuse))<0){ERR_MSG("setsockopt");return -1;}//绑定服务器地址信息,必须绑定struct sockaddr_in sin;sin.sin_family = AF_INET;sin.sin_port = htons(PORT);sin.sin_addr.s_addr= inet_addr(IP);//绑定IP及端口号if(bind(fd,(struct sockaddr*)&sin,sizeof(sin))<0){ERR_MSG("bind");return -1;}printf("绑定成功\n");char arr[128];struct sockaddr_in cin;socklen_t addrlen = sizeof(arr);while(1){//发送数据printf("请输入数据>>>>>");fgets(arr,sizeof(arr),stdin);arr[strlen(arr)-1] = '\0';if(sendto(fd,arr,sizeof(arr),0,\(struct sockaddr*)&sin,sizeof(sin))<0) {ERR_MSG("sendto");return -1;}printf("发送成功\n");bzero(arr,sizeof(arr));}close(fd);return 0;
}
组播
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>
#include <arpa/inet.h>
#include <unistd.h>#define PORT 6667
#define IP "224.1.2.3"
#define ERR_MSG(msg) do{\fprintf(stderr,"line:%d\n",__LINE__);\perror(msg);\
}while(0)int main(int argc, const char *argv[])
{int fd = socket(AF_INET,SOCK_DGRAM,0);if(fd<0){ERR_MSG("scoket");return -1; }printf("创建流式套接字成功cd=%d\n",fd);//允许端口被重int reuse = 1;if(setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse))<0){ERR_MSG("setsockopt");return -1;}printf("允许端口被重复使用\n");//允许广播if(setsockopt(fd,SOL_SOCKET,SO_BROADCAST,&reuse,sizeof(reuse))<0){ERR_MSG("setsockopt");return -1;}//绑定服务器地址信息,必须绑定struct sockaddr_in sin;sin.sin_family = AF_INET;sin.sin_port = htons(PORT);sin.sin_addr.s_addr= inet_addr(IP);//绑定IP及端口号if(bind(fd,(struct sockaddr*)&sin,sizeof(sin))<0){ERR_MSG("bind");return -1;}printf("绑定成功\n");char arr[128];struct sockaddr_in cin;socklen_t addrlen = sizeof(arr);while(1){//发送数据 printf("请输入数据>>>>>");fgets(arr,sizeof(arr),stdin);arr[strlen(arr)-1] = '\0';if(sendto(fd,arr,sizeof(arr),0,\(struct sockaddr*)&sin,sizeof(sin))<0){ERR_MSG("sendto");return -1;}printf("发送成功\n");bzero(arr,sizeof(arr));}close(fd);return 0;
}
相关文章:

用进程和线程完成TCP进行通信操作及广播和组播的通信
进程 代码 #include <stdio.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <string.h>#include <unistd.h>#include <stdlib.h>#include <signal.h>#includ…...

浅谈Tomcat
文章目录 一、什么是Tomcat?二、Tomcat的下载安装三、使用tomcat访问资源 一、什么是Tomcat? Tomcat 就是一个 HTTP 服务器。 前面我们聊了HTTP服务器,像我们在网页输入URL,其实就是在给人家的HTTP服务器发送请求,既…...

C++精解【7】
文章目录 eigen矩阵初始化多维矩阵矩阵和向量size固定大小or 动态大小Matrix类六个模板参数初始化向量元素类型 参考文献 eigen 矩阵初始化 多维矩阵 数组 MatrixXi a { // construct a 2x2 matrix{1, 2}, // first row{3, 4} // second row }; Matrix<do…...

堆箱子00
题目链接 堆箱子 题目描述 注意点 将箱子堆起来时,下面箱子的宽度、高度和深度必须大于上面的箱子 解答思路 初始想到深度优先遍历,最后超时了参照题解使用动态规划,先将盒子从小到大进行排序,dp[i]存储的是到第i个箱子时堆箱…...

Linux 命令:iftop
1. 写在前面 本文主要介绍 Linux iftop(Interface TOP) 命令:iftop 是一款小巧、免费且功能强大的网卡实时流量监控工具。监控指定网卡的实时流量、端口连接信息、反向解析 IP 等,还可以精确显示本机网络流量及网络内各主机和本机…...

web学习笔记(六十九)vue2
目录 1. vue2创建脚手架项目 2.vue2如何关闭eslint 1. vue2创建脚手架项目 (1)在cmd窗口输入npm install -g vue/cli命令行,快速搭建脚手架。 (2) 创建vue2项目 (3) 选择配置项目,…...
JavaScript全解:从基础到高级,掌握每一个知识点
引言: JavaScript是一种广泛使用的脚本语言,主要用于Web浏览器,但近年来也扩展到了服务器端(Node.js)和其他领域。它允许开发者创建交互式的网页,处理数据,控制用户界面,甚至构建完…...

RabbitMQ的Direct交换机
Direct交换机 BindingKey 在Fanout模式中,一条消息,会被所有订阅的队列都消费。但是,在某些场景下,我们希望不同的消息被不同的队列消费。这时就要用到Direct类型的Exchange。 在Direct模型下: 队列与交换机的绑定&a…...
2024.6.26 待学习知识点
OOALV https://www.cnblogs.com/BruceKing/p/11447499.html " 取工单的组件 lt_aufnr CORRESPONDING #( lt_out MAPPING aufnr aufnr EXCEPT * ). ABAP POPUP_TO_CONFIRM 弹出框函数 CLASS-EVENTS CLASS-METHODS main. CLASS-METHODS raise_event_EXIT_COMMAND IMPOR…...
【LeetCode】每日一题:相交链表
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。 图示两个链表在节点 c1 开始相交: 题目数据 保证 整个链式结构中不存在环。 注意,函数返回结果后&am…...

6.26.1 残差卷积变压器编码器的混合工作流程用于数字x线乳房x光片乳腺癌分类
基于残差卷积网络和多层感知器变压器编码器(MLP)的优势,提出了一种新型的混合深度学习乳腺病变计算机辅助诊断(CAD)系统。利用骨干残差深度学习网络创建深度特征,利用Transformer根据自注意力机制对乳腺癌进行分类。所提出的CAD系统具有识别两种情况乳腺…...

[leetcode]avoid-flood-in-the-city 避免洪水泛滥
. - 力扣(LeetCode) class Solution { public:vector<int> avoidFlood(vector<int>& rains) {vector<int> ans(rains.size(), 1);set<int> st;unordered_map<int, int> mp;for (int i 0; i < rains.size(); i) {i…...

Pytorch基础
文章目录 零、tensorboard0.1基本使用案例 一、数据结构:Tensor1.1数据类型1.2Tensor的创建方式1.3张量的基本运算1.4张量的属性 二、数据集加载器DataLoaders2.0前置知识2.0.1torch.scatter()、torch.scatter_() 2.1官方案例2.1.1从TorchVision加载数据集2.1.2迭代…...
嵌入技术Embedding
嵌入(Embedding)是一种将高维数据映射到低维空间的技术,广泛应用于自然语言处理(NLP)、计算机视觉和推荐系统等领域。嵌入技术的核心思想是将复杂的数据表示为低维向量,使其在这个低维空间中保留尽可能多的…...

Pandas中的数据转换[细节]
今天我们看一下Pandas中的数据转换,话不多说直接开始🎇 目录 一、⭐️apply函数应用 apply是一个自由度很高的函数 对于Series,它可以迭代每一列的值操作: 二、⭐️矢量化字符串 为什么要用str属性 替换和分割 提取子串 …...
vue2面试题——路由
1. 路由的模式和区别 路由的模式:history,hash 区别: 1. 表象不同 history路由:以/为结尾,localhost:8080——>localhost:8080/about hash路由:会多个#,localhost:8080/#/——>localhost:…...
【AI应用探讨】—朴素贝叶斯应用场景
目录 文本分类 推荐系统 信息检索 生物信息学 金融领域 医疗诊断 其他领域 文本分类 垃圾邮件过滤:朴素贝叶斯被广泛用于垃圾邮件过滤任务,通过邮件中的文本内容来识别是否为垃圾邮件。例如,它可以基于邮件中出现的单词或短语的概率来…...

使用matlab的大坑,复数向量转置!!!!!变量区“转置变量“功能(共轭转置)、矩阵转置(默认也是共轭转置)、点转置
近期用verilog去做FFT相关的项目,需要用到matlab进行仿真然后和verilog出来的结果来做对比,然后计算误差。近期使用matlab犯了一个错误,极大的拖慢了项目进展,给我人都整emo了,因为怎么做仿真结果都不对,还…...

昇思25天学习打卡营第8天|保存与加载
1. 学习内容复盘 1.1 保存与加载 上一章节主要介绍了如何调整超参数,并进行网络模型训练。在训练网络模型的过程中,实际上我们希望保存中间和最后的结果,用于微调(fine-tune)和后续的模型推理与部署,本章…...
【vueUse库Animation模块各函数简介及使用方法】
vueUse库是一个专门为Vue打造的工具库,提供了丰富的功能,包括监听页面元素的各种行为以及调用浏览器提供的各种能力等。其中的Browser模块包含了一些实用的函数,以下是这些函数的简介和使用方法: vueUse库Sensors模块各函数简介及使用方法 vueUseAnimation函数1. useInter…...

SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...

聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
rnn判断string中第一次出现a的下标
# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...
IP如何挑?2025年海外专线IP如何购买?
你花了时间和预算买了IP,结果IP质量不佳,项目效率低下不说,还可能带来莫名的网络问题,是不是太闹心了?尤其是在面对海外专线IP时,到底怎么才能买到适合自己的呢?所以,挑IP绝对是个技…...

搭建DNS域名解析服务器(正向解析资源文件)
正向解析资源文件 1)准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2)服务端安装软件:bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...
LRU 缓存机制详解与实现(Java版) + 力扣解决
📌 LRU 缓存机制详解与实现(Java版) 一、📖 问题背景 在日常开发中,我们经常会使用 缓存(Cache) 来提升性能。但由于内存有限,缓存不可能无限增长,于是需要策略决定&am…...
WebRTC从入门到实践 - 零基础教程
WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC? WebRTC(Web Real-Time Communication)是一个支持网页浏览器进行实时语音…...