网络编程 3

广播  

发送端

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#define IP "192.168.0.255"//广播地址
#define PORT 6666
int main(int argc, const char *argv[])
{
	//创建套接字文件描述符
	//定义通用结构体变量并填充结构体数据
	//定义通用地址结构变量来接收服务器数据
	//发送数据
	//接收数据
	//关闭文件描述符
	int cfd=socket(AF_INET,SOCK_DGRAM,0);
	if(cfd < 0)
	{
		perror("socke");
		return -1;
	}
	printf("UDP套接字文件描述符sfd= %d \n",cfd);

	//设置允许广播
	int broad =1;
	if(setsockopt(cfd,SOL_SOCKET,SO_BROADCAST,&broad,sizeof(broad)) < 0)
	{
		perror("setsockopt");
		return -1;
	}
	printf("set broadcast success\n");





	struct sockaddr_in sin;
	sin.sin_family=AF_INET;
	sin.sin_port=htons(PORT);
	sin.sin_addr.s_addr=inet_addr(IP);


	struct sockaddr_in cin;
	socklen_t size_sin=sizeof(cin);

	char temp[128]="";
	ssize_t res =0;
	while(1)
	{
		bzero(temp,sizeof(temp));
		printf("请输入---");
		fgets(temp,sizeof(temp),stdin);
		temp[strlen(temp)-1]=0;
				
		if( sendto(cfd,temp,sizeof(temp),0,(struct sockaddr*)&sin,sizeof(sin)) <0)
		{
			perror("recvfrom");
			return -1;
		}
		printf("发送成功\n");
		
	}
	close(cfd);

	return -1;
}

接收端

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#define IP "192.168.0.255"
#define PORT 6666
int main(int argc, const char *argv[])
{
	//创建套接字文件描述符
	//定义通用结构体变量并填充结构体数据
	//定义通用地址结构变量来接收服务器数据
	//发送数据
	//接收数据
	//关闭文件描述符
	

	
	int cfd=socket(AF_INET,SOCK_DGRAM,0);//数据报的形式创建套接字并获取文件描述符
	if(cfd < 0)
	{
		perror("socke");
		return -1;
	}
	printf("UDP协议--数据报套接字文件描述符sfd= %d \n",cfd);


	struct sockaddr_in cin;//创建通用地址结构变量,填充IP协议,端口号,IP地址
	cin.sin_family=AF_INET;
	cin.sin_port=htons(PORT);
	cin.sin_addr.s_addr=inet_addr(IP);

	if(bind(cfd,(struct sockaddr*)&cin,sizeof(cin))< 0)//经由socket的文件描述符及一个指向存有通用地址数据的结构体变量和该地址的数据大小(数据长度)来进行绑定
	{
		perror("bind");
		return -1;
	
	}

	struct sockaddr_in sin;//定义一个新的地址变量
	socklen_t size_sin=sizeof(sin);//

	char temp[128]="";
	ssize_t res =0;
	while(1)
	{
		bzero(temp,sizeof(temp));
				
		res = recvfrom(cfd,temp,sizeof(temp),0,(struct sockaddr*)&sin,&size_sin);//通过socket的文件描述符及temp指向的临时容器中转数据并将数据中包含发送者的地址数据存储到指针指向的地址数据
		if(res < 0	)
		{
			perror("recvfrom");
			return -1;
		}
		printf("[地址:%s 端口:%d]   recvfrom:%s\n",inet_ntoa(sin.sin_addr),ntohs(sin.sin_port),temp);
		
	}
	close(cfd);

	return -1;
}

组播

发送端

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#define IP "224.1.2.3"
#define PORT 6666
int main(int argc, const char *argv[])
{
	//创建套接字文件描述符
	int cfd =socket(AF_INET,SOCK_DGRAM,0);
	if(cfd < 0)
	{
		perror("socket");
		return -1;
	}
	printf("UDP套接字文件描述符sfd= %d \n",cfd);

	//定义通用结构体变量并填充结构体数据
	struct sockaddr_in sin;
	sin.sin_family=AF_INET;
	sin.sin_port=htons(PORT);
	sin.sin_addr.s_addr=inet_addr(IP);



	char temp[128]="";
	ssize_t res =0;
	while(1)
	{
		bzero(temp,sizeof(temp));

		printf("请输入--");
		fgets(temp,sizeof(temp),stdin);
		temp[strlen(temp)-1]=0;
			//发送数据程序体
		if(sendto(cfd,temp,sizeof(temp),0,(struct sockaddr*)&sin,sizeof(sin)) < 0)
		{
			perror("sendto");
			return -1;
		}
		printf("信息发送成功\n");
	}
	//关闭文件描述符
	close(cfd);

	return -1;
}

接收端

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#define IP "192.168.0.199"
#define GRP_IP "224.1.2.3"
#define PORT 6666
int main(int argc, const char *argv[])
{
	//创建套接字文件描述符
	int sfd =socket(AF_INET,SOCK_DGRAM,0);
	if(sfd < 0)
	{
		perror("socket");
		return -1;
	}
	printf("UDP套接字文件描述符sfd= %d \n",sfd);




	//加入多播组
	struct ip_mreqn mq;
	mq.imr_multiaddr.s_addr =inet_addr(GRP_IP);
	mq.imr_address.s_addr =inet_addr(IP);
	mq.imr_ifindex =2;//网卡号

	if(setsockopt(sfd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mq,sizeof(mq)) <0)
	{
		perror("setsockopt");

		return -1;
	}
	printf("加入多播组成功\n");

	//定义通用结构体变量并填充结构体数据
	struct sockaddr_in sin;
	sin.sin_family=AF_INET;
	sin.sin_port=htons(PORT);//端口号
	sin.sin_addr.s_addr=inet_addr(GRP_IP);//组IP号
	
	if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin)) < 0)
	{
		perror("bind");
		return -1;
	}
	struct sockaddr_in cin;
	socklen_t addrlen = sizeof(cin);

	char temp[128]="";
	ssize_t res =0;
	while(1)
	{
		bzero(temp,sizeof(temp));

				//发送数据程序体
		res = recvfrom(sfd,temp,sizeof(temp),0,(struct sockaddr*)&cin,&addrlen);
		if(res <0)
		{
			perror("sendto");
			return -1;
		}
		printf("[%s :%d ]  %s\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),temp);
	}
	//关闭文件描述符:w
	
	close(sfd);

	return -1;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值