当前位置: 首页 > article >正文

将广播发送和接收端实现一遍,完成一个发送端发送信息,对应多个接收端接收信息实验。

1、将广播发送和接收端实现一遍,完成一个发送端发送信息,对应多个接收端接收信息实验。

接受端

#include<myhead.h>
#define handel_err(res,val) if(val==-1){perror(res);return-1;}
int main(int argc, const char *argv[])
{
	int rfd=socket(AF_INET,SOCK_DGRAM,0);
	handel_err("socket",rfd);

	//绑定
	struct sockaddr_in rin={
		.sin_family=AF_INET,
		.sin_port=htons(6666),
		.sin_addr.s_addr=inet_addr("255.255.255.255")
	};
	int res=bind(rfd,(struct sockaddr *)&rin,sizeof(rin));
	handel_err("bind",res);

	struct sockaddr_in client;
	socklen_t len=sizeof(client);
	//接收
	char buf[1024]="";
	while(1){
		bzero(buf,sizeof(buf));
		recvfrom(rfd,buf,sizeof(buf),0,(struct sockaddr *)&client,&len);
		printf("[%s:%d]->%s\n",inet_ntoa(client.sin_addr),ntohs(client.sin_port),buf);
	}
	return 0;
}

发送端

#include<myhead.h>
#define handel_err(res,val) if(val==-1){perror(res);return-1;}
int main(int argc, const char *argv[])
{
	int oldfd=socket(AF_INET,SOCK_DGRAM,0);
	handel_err("oldfd",oldfd);

	//设置广播
	int k=1;
	 setsockopt(oldfd,SOL_SOCKET,SO_BROADCAST,&k,sizeof(k));
	printf("广播设置成功\n");
	struct sockaddr_in broadcast={
		.sin_family=AF_INET,
		.sin_port=htons(6666),
		.sin_addr.s_addr=inet_addr("255.255.255.255") //广播IP
	};

	char buf[1024];
	while(1){
		fgets(buf,sizeof(buf),stdin);
		buf[strlen(buf)-1]=0;
		sendto(oldfd,buf,sizeof(buf),0,(struct sockaddr *)&broadcast,sizeof(broadcast));

	}
	close(oldfd);
	return 0;
}

2、使用多线程基于TCP协议的并发执行,一个服务器对应多个客户端实现通信实验。

客户端

#include<myhead.h>
#define handel_err(res,val) if(val==-1){perror(res);return-1;}
int main(int argc, const char *argv[])
{
	//套 链
	int cfd=socket(AF_INET,SOCK_STREAM,0);
	handel_err("socket",cfd);
	struct sockaddr_in server={
		.sin_family=AF_INET,
		.sin_port=htons(6666),
		.sin_addr.s_addr=inet_addr("192.168.238.227")
	};
	int res=connect(cfd,(struct sockaddr *)&server,sizeof(server));
	handel_err("connect",res);

	char buf[1024]="";
	while(1){
		printf("请输入>>");
		fgets(buf,sizeof(buf),stdin);
		buf[strlen(buf)-1]=0;
		send(cfd,buf,sizeof(buf),0);
		
		recv(cfd,buf,sizeof(buf),0);

	}

	
	return 0;
}

服务器

#include<myhead.h>
#define handel_err(res,val) if(val==-1){perror(res);return-1;}
//客户端信息
struct Info{
	int cfd;
	struct sockaddr_in client;
	socklen_t client_len;
};

//子线程
void *fun(void *n){
	struct sockaddr_in client=(*(struct Info*)n).client;
	socklen_t client_len=(*(struct Info *)n).client_len;
	int cfd=(*(struct Info *)n).cfd;
	char buf[1024]="";
	while(1){
	int res=recv(cfd,buf,sizeof(buf),0);
	if(res==0){
		printf("下线\n");
		close(cfd);
		break;
	}
	printf("[%s:%d]->%s\n",inet_ntoa(client.sin_addr),htons(client.sin_port),buf);
	send(cfd,"收到\n",sizeof("收到\n"),0);

	}
}
int main(int argc, const char *argv[])
{
	//套 绑 监
	int sfd=socket(AF_INET,SOCK_STREAM,0);
	handel_err("socket",sfd);
	int k=1;
	setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&k,sizeof(k));
	struct sockaddr_in server={
		.sin_family=AF_INET,
		.sin_port=htons(6666),
		.sin_addr.s_addr=inet_addr("192.168.238.227")
	};
	int res=bind(sfd,(struct sockaddr *)&server,sizeof(server));
	handel_err("bind ",res);
	res=listen(sfd,10);
	handel_err("listen",res);

	//多线程操作
	struct sockaddr_in client;
	socklen_t client_len=sizeof(client);
	
	while(1){
	pthread_t tid;
	//接收
	int cfd=accept(sfd,(struct sockaddr *)&client,&client_len);
	printf("success\n");
	handel_err("accept",cfd);
	struct Info client_info={
		.cfd=cfd,
		.client=client,
		.client_len=client_len
	};
	//创建子线程
	pthread_create(&tid,NULL,fun,&client_info);

	//设置游离态
	pthread_detach(tid);
	}
	return 0;
}


http://www.kler.cn/a/463756.html

相关文章:

  • 框架模块说明 #09 日志模块_01
  • 【机器学习】【朴素贝叶斯分类器】从理论到实践:朴素贝叶斯分类器在垃圾短信过滤中的应用
  • C语言渗透和好网站
  • Redis(二)value 的五种常见数据类型简述
  • React-Router 一站式攻略:从入门到精通,掌握路由搭建与权限管控
  • 【区块链】零知识证明基础概念详解
  • 怎么在 Linux 下运行 smart_rtmpd
  • 多模态论文笔记——CogVLM和CogVLM2(副)
  • [Linux]操作系统概念
  • Postman[4] 环境设置
  • ThinkPHP 8高效构建Web应用-第一个简单的MVC应用示例
  • Java Map 集合详解:基础用法、常见实现类与高频面试题解析
  • opencv图像直方图
  • 运动健康小程序SpringBoot+论文源码调试讲解
  • RabbitMQ-TTL机制
  • 缓存菜品的业务代码
  • 政策助力数字金融,CES Asia 2025展望科技新未来
  • AI 自动化编程对编程教育的影响
  • 每天五分钟机器学习:凸集
  • uni-app tab 双击事件监听
  • 前端小白学习之路-Vben探索 配置详情 - 2/50
  • 二、github基础
  • 【疑难杂症】 HarmonyOS NEXT中Axios库的响应拦截器无法拦截424状态码怎么办?
  • scala图书管理系统 【dao】软件包
  • A-Tune性能优化工具介绍
  • Python 语言实现 IP 地址转换