网络进程:广播、组播、流式域、报式域(套接字)

1.广播

1.1广播发送端模型(类似UDP客户端)

程序代码:

#include<myhead.h>
int main(int argc, const char *argv[])
{//创建套接字int sfd=socket(AF_INET,SOCK_DGRAM,0);if(sfd==-1){perror("socket error");return -1;}//将套接字设置成允许广播int broadcast=1;if(setsockopt(sfd,SOL_SOCKET,SO_BROADCAST,&broadcast,sizeof(broadcast))==-1)//套接字描述符,套接字要设置的层(应用层)、指定层内属性(允许广播)//设置该属性容器起始地址,参数4的大小{perror("setsockopt error");return -1;}//绑定,非必要//填充接收端地址信息结构体struct sockaddr_in cin;cin.sin_family=AF_INET;cin.sin_port=htons(6789);cin.sin_addr.s_addr=inet_addr("192.168.125.255");//发送消息char sbuf[128]="";while(1){printf("请输入>>>");fgets(sbuf,sizeof(sbuf),stdin);sbuf[strlen(sbuf)-1]=0;//发送到广播地址sendto(sfd,sbuf,sizeof(sbuf),0,(struct sockaddr*)&cin,sizeof(cin));printf("发送成功\n");}//关闭套接字close(sfd);return 0;
}

1.2广播接收端模型(类似UDP服务器端)

程序代码:

#include<myhead.h>
int main(int argc, const char *argv[])
{//创建套接字int rfd=socket(AF_INET,SOCK_DGRAM,0);if(rfd==-1){perror("socket error");return -1;}//填充地址信息结构体struct sockaddr_in rin;rin.sin_family=AF_INET;rin.sin_port=htons(6789);rin.sin_addr.s_addr=inet_addr("192.168.125.255");//绑定if(bind(rfd,(struct sockaddr*)&rin,sizeof(rin))==-1){perror("bind error");return -1;}//接收信息char rbuf[128]="";while(1){//清空数组bzero(rbuf,sizeof(rbuf));//接受信息recvfrom(rfd,rbuf,sizeof(rbuf),0,0,0);printf("收到消息:%s\n",rbuf);}//关闭套接字close(rfd);return 0;
}

运行结果:

2. 组播

2.1组播发送端模型(类型UDP客户端)

程序代码:

#include<myhead.h>
int main(int argc, const char *argv[])
{//创建套接字int rfd=socket(AF_INET,SOCK_DGRAM,0);if(rfd==-1){perror("socket error");return -1;}//绑定非必要//填充地址信息结构体struct sockaddr_in sin;sin.sin_family=AF_INET;sin.sin_port=htons(9999);sin.sin_addr.s_addr=inet_addr("224.1.2.3");//发送消息char sbuf[128]="";while(1){printf("请输入>>>");fgets(sbuf,sizeof(sbuf),stdin);sbuf[strlen(sbuf)-1]=0;sendto(rfd,sbuf,strlen(sbuf),0,(struct sockaddr*)&sin,sizeof(sin));printf("发送成功\n");}close(rfd);return 0;
}

2.2组播接收端模型(类似UDP服务器端)

程序代码:

#include<myhead.h>
int main(int argc, const char *argv[])
{int rfd=socket(AF_INET,SOCK_DGRAM,0);if(rfd==-1){perror("socket error");return -1;}printf("rfd=%d\n",rfd);//设置加入多播族struct ip_mreqn imr;imr.imr_multiaddr.s_addr=inet_addr("224.1.2.3");imr.imr_address.s_addr=inet_addr("192.168.125.227");imr.imr_ifindex=2;//网卡编号if(setsockopt(rfd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&imr,sizeof(imr))==-1){perror("setsockopt error");return -1;}printf("加入组播成功\n");//填充地址信息结构体struct sockaddr_in rin;rin.sin_family=AF_INET;rin.sin_port=htons(9999);rin.sin_addr.s_addr=inet_addr("224.1.2.3");if(bind(rfd,(struct sockaddr*)&rin,sizeof(rin))==-1){perror("bind error");return -1;}char rbuf[128]="";while(1){bzero(rbuf,sizeof(rbuf));recv(rfd,rbuf,sizeof(rbuf),0);printf("收到:%s\n",rbuf);}close(rfd);return 0;
}

运行结果:

3.流式域套接字

3.1流式域套接字服务器端

程序代码:

#include<myhead.h>
int main(int argc, const char *argv[])
{int sfd=socket(AF_UNIX,SOCK_STREAM,0);if(sfd==-1){perror("socket error");return -1;}//判断套接字文件存在,存在删除if(access("./mysocket",F_OK)==0){//存在删除if(unlink("./mysocket")==-1){perror("unlink error");return -1;}}//2.绑定套接字文件//2.1填充地址信息结构体struct sockaddr_un sun;sun.sun_family=AF_UNIX;//字符串不能用赋值运算符赋值strcpy(sun.sun_path,"./mysocket");//2.2绑定if(bind(sfd,(struct sockaddr*)&sun,sizeof(sun))==-1){perror("bind error");return -1;}printf("bind success\n");//3.监听if(listen(sfd,128)==-1){perror("listen error");return -1;}printf("listen success\n");//4.阻塞等待客户端连接请求//定义容器接收客户端地址信息struct sockaddr_un cun;socklen_t socklen=sizeof(cun);int newfd=-1;if((newfd=accept(sfd,(struct sockaddr*)&cun,&socklen))==-1){perror("accept error");return -1;}printf("有新客户发来连接请求\n");//5.数据收发char rbuf[128]="";while(1){bzero(rbuf,sizeof(rbuf));int res=recv(newfd,rbuf,sizeof(rbuf),0);if(res==0){printf("客户端已下线\n");break;}printf("[%s]:%s\n",cun.sun_path,rbuf);//连接一个笑脸回复strcat(rbuf,"*_*");//发送回去send(newfd,rbuf,strlen(rbuf),0);printf("发送成功\n");}close(sfd);close(newfd);return 0;
}

3.2流式域套接字客户端

程序代码:

#include<myhead.h>
int main(int argc, const char *argv[])
{//1.创建用于通信的套接字文件描述符int cfd=socket(AF_UNIX,SOCK_STREAM,0);if(cfd==-1){perror("socket error");return -1;}printf("cfd=%d\n",cfd);//判断套接字文件是否存在,如果存在删除if(access("./mysocket1",F_OK)==0){//存在删除if(unlink("./mysocket1")==-1){perror("unlink error");return -1;}}//2.绑定(不绑定,系统不会绑定)//2.1填充地址信息结构体struct sockaddr_un cun;cun.sun_family=AF_UNIX;strcpy(cun.sun_path,"./mysocket1");//2.2绑定if(bind(cfd,(struct sockaddr*)&cun,sizeof(cun))==-1){perror("bind error");return -1;}printf("bind success\n");//3.连接服务器//3.1填充要连接的服务器地址信息结构体struct sockaddr_un sun;sun.sun_family=AF_UNIX;strcpy(sun.sun_path,"./mysocket");//3.2连接服务器if(connect(cfd,(struct sockaddr*)&sun,sizeof(sun))==-1){perror("connect error");return -1;}printf("connect success\n");//4.数据收发char wbuf[128]="";while(1){bzero(wbuf,sizeof(wbuf));printf("请输入>>>");fgets(wbuf,sizeof(wbuf),stdin);wbuf[strlen(wbuf)-1]=0;//将数据发送给服务器send(cfd,wbuf,strlen(wbuf),0);printf("发送成功\n");//判断发送的数据if(strcmp(wbuf,"quit")==0){break;}//接收服务器发来的消息//清空数据bzero(wbuf,sizeof(wbuf));recv(cfd,wbuf,sizeof(wbuf),0);printf("收到消息:%s\n",wbuf);}close(cfd);return 0;
}

运行结果:

4.报式域套接字

4.1报式域套接字服务器端

程序代码:

#include<myhead.h>
int main(int argc, const char *argv[])
{//创建套接字int sfd=socket(AF_UNIX,SOCK_DGRAM,0);//SOCK_DGRAM使用UDP报式套接字通信if(sfd==-1){perror("socket error");return -1;}printf("sfd=%d\n",sfd);//域套接字绑定函数,只能绑定一个不存在的套接字文件//绑定前判断当前文件是否存在if(access("./linux",F_OK)==0){//文件存在删除if(unlink("./linux")==-1){perror("unlink error");return -1;}}//绑定//填充地址信息结构体struct sockaddr_un sun;sun.sun_family=AF_UNIX;strcpy(sun.sun_path,"./linux");//绑定if(bind(sfd,(struct sockaddr*)&sun,sizeof(sun))==-1){perror("bind error");return -1;}//数据收发char buf[128]="";//定义变量存放客户端地址信息结构体struct sockaddr_un cun;socklen_t socklen=sizeof(cun);while(1){//清空数组bzero(buf,sizeof(buf));//从套接字文件读取消息recvfrom(sfd,buf,sizeof(buf),0,(struct sockaddr*)&cun,&socklen);printf("[%s]:%s\n",cun.sun_path,buf);//将字符串连接后回发strcat(buf,"*_*");//if(write(sfd,buf,sizeof(buf))==-1)if(sendto(sfd,buf,sizeof(buf),0,(struct sockaddr*)&cun,sizeof(cun))==-1){perror("write error");return -1;}printf("发送成功\n");}//关闭套接字close(sfd);return 0;
}

4.2报式域套接字客户端

程序代码:

#include<myhead.h>
int main(int argc, const char *argv[])
{//创建用于通信的套接字文件描述符int cfd=socket(AF_UNIX,SOCK_DGRAM,0);if(cfd==-1){perror("socket error");return -1;}//域套接字绑定函数,只能绑定一个不存在的套接字文件//绑定前,判断当前文件是否存在if(access("./unix",F_OK)==0){//文件存在,删除if(unlink("./unix")==-1){perror("unlink error");return -1;}}//绑定//填充地址信息结构体struct sockaddr_un cun;cun.sun_family=AF_UNIX;strcpy(cun.sun_path,"./unix");//绑定if(bind(cfd,(struct sockaddr*)&cun,sizeof(cun))==-1){perror("bind error");return -1;}//填充服务器的地址信息结构体struct sockaddr_un sun;sun.sun_family=AF_UNIX;strcpy(sun.sun_path,"./linux");//数据收发char buf[128]="";while(1){printf("请输入>>>");fgets(buf,sizeof(buf),stdin);buf[strlen(buf)-1]=0;//发送给服务器sendto(cfd,buf,sizeof(buf),0,(struct sockaddr*)&sun,sizeof(sun));if(strcmp(buf,"quit")==0)break;//接收服务器发来的消息recvfrom(cfd,buf,sizeof(buf),0,NULL,NULL);printf("收到消息:%s\n",buf);}//关闭套接字close(cfd);return 0;
}

运行结果:

流程图:

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

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

相关文章

Ubuntu 18.04(x86_64)安装配置 CUDA 11.6 + cuDNN v8.9.7 + TensorRT8.4.1.5(亲测可用)

1. 检查是否安装显卡驱动 lspci | grep -i nvidianvidia-smi 如果显示特定的界面&#xff0c;这表明显卡驱动已经被安装。若未安装驱动&#xff0c;则需通过手动方式进行安装。 首先&#xff0c;需要添加软件源&#xff1a; 执行以下命令以添加PPA源&#xff1a; sudo add-…

测试环境搭建整套大数据系统-问题篇(一:实时遇到的问题)

1. java.io.IOException: Failed to deserialize JSON ‘{“age”:867,“sex”:“fba8c074f9”,“t_insert_time”:“2024-03-04 14:12:24.821”}’ 解决方式 修改数据类型。将TIMESTAMP_LTZ改为TIMESTAMP。 2. java. lang,classNotFoundException: org,apache.flink,streami…

Docker镜像导出/导入

Docker镜像导出/导入 一、前言 在实际操作中&#xff0c;为了便于docker镜像环境和服务配置的迁移&#xff0c;我们有时需要将已在测试环境主机上完成一系列配置的docker镜像或运行中的容器镜像导出&#xff0c;并传输到生产或其他目标环境主机上运行。为此&#xff0c;本文主…

使用 gulp-cleanwxss 清除小程序无用样式代码

小程序在迭代中&#xff0c;因没有及时清理无用样式&#xff0c;造成包体积越来越大。而通过人工判断清除工作量大&#xff0c;因而使用 gulp-cleanwxss 实现脚本清除。 一、Demo 演示 二、实现步骤 1、全局安装 gulp 命令行工具 yarn global add gulp-cli2、局部安装依赖 gu…

尚硅谷Java数据结构--线索化二叉树

出现空指针异常&#xff08;先记录一下&#xff09; &#xff08;希望大佬能够指出是哪里出了问题&#xff09; package DataStructure;/*** Created with IntelliJ IDEA.* Description:* User: 86178* Date: 2024-03-05* Time: 10:39*/ public class ThreadedBinaryTreeDemo …

蓝桥杯-单片机组基础7-存储器映射扩展与PWM脉冲调制(附小蜜蜂课程代码)

蓝桥杯单片机组备赛指南请查看这篇文章&#xff1a;戳此跳转蓝桥杯备赛指南文章 本文章针对蓝桥杯-单片机组比赛开发板所写&#xff0c;代码可直接在比赛开发板上使用。 型号&#xff1a;国信天长4T开发板&#xff08;绿板&#xff09;&#xff0c;芯片&#xff1a;IAP15F2K6…

备战蓝桥杯---图论应用1

目录 1.增加虚点建图&#xff1a; 2.抽象图的迪杰斯特拉&#xff1a; 3.用bitset优化弗洛伊德&#xff1a; 4.有向图的Prim/kruskal&#xff1a; 1.增加虚点建图&#xff1a; 我们当然可以每一层与上一层的点再连上一条边&#xff0c;但这样子边太多了超内存&#xff0c;我们…

【格与代数系统】偏序关系、偏序集与全序集

关系&#xff1a;X,Y是两个非空集合, 记若则称R是X到Y的一个二元关系&#xff0c;简称关系。 若,记。 当时&#xff0c;称是上的一个关系。 目录 偏序关系 偏序集 可比性 全序集 最值与上下界 上下确界 偏序关系 设是上的一个关系&#xff0c;若满足&#xff1a; (1)自…

springboot+bootstrap+jsp校园二手书交易平台mlg86

考虑到实际生活中在校园二手书交易系统方面的需要以及对该系统认真的分析,将系统权限按管理员和学生这两类涉及用户划分。 (a) 管理员&#xff1b;管理员使用本系统涉到的功能主要有个人中心、学生管理、图书类型管理、二手图书管理、通知公告管理、管理员管理、用户留言、系统…

微信小程序开发学习笔记《19》uni-app框架-配置小程序分包与轮播图跳转

微信小程序开发学习笔记《19》uni-app框架-配置小程序分包与轮播图跳转 博主正在学习微信小程序开发&#xff0c;希望记录自己学习过程同时与广大网友共同学习讨论。建议仔细阅读uni-app对应官方文档 一、配置小程序分包 分包可以减少小程序首次启动时的加载时间 为此&#…

idea中引入新JDK环境

在不同的项目中往往会需要不同的运行环境&#xff0c;那么如何下载一个新的环境并运用到idea中呢&#xff1f; 下面给出的就是oracle官网&#xff0c;以JDK17为例教大家如何下载 Java Archive Downloads - GraalVM for JDK 17https://www.oracle.com/java/technologies/javase…

钉钉h5应用 环境报错Error: Do not support the current environment:notInDingTalk

钉钉h5应用 环境报错 Error: Do not support the current environment&#xff1a;notInDingTalk problem Error: Do not support the current environment&#xff1a;notInDingTalk reason 前端页面运行在普通浏览器 solution 需要将h5页面在后台发布后&#xff0c;在钉…