使用UDP广播

发送端:关键是通过函数设置SOCKET是广播BROADCAST类型的。代码如下:

#include<stdio.h>
#include<winsock2.h>
#pragma comment(lib,"ws2_32.lib")

int main()
{
 SOCKET s;
 sockaddr_in addrto, a;
 WSADATA wsdata;
 char *smsg="this is a test";
 BOOL opt=TRUE;

 //启动SOCKET库,版本为1.1
 WSAStartup(MAKEWORD(1,1),&wsdata);
 s=socket(AF_INET, SOCK_DGRAM, 0);
 
 //设置该套接字为广播类型,关键代码
 setsockopt(s,SOL_SOCKET,SO_BROADCAST,(char FAR *)&opt,sizeof(opt));

 //用来绑定套接字
 a.sin_family=AF_INET;
 a.sin_addr.s_addr=htonl(INADDR_ANY);
 a.sin_port=htons(0);
 if(bind(s,(sockaddr*)&a, sizeof(sockaddr_in))!=0)
      
  printf("Can't bind socket to local port! Program stop.\n");//初始化失败返回-1      
  return     -1;      
 
 
 //然后赋值给地址,用来向网络上的该端口广播消息;
 addrto.sin_family=AF_INET;
 addrto.sin_addr.s_addr=htonl(INADDR_BROADCAST);
 addrto.sin_port=htons(7002); //必须是同一个端口 
 
 while(1)
 {
  Sleep(1500);
  int nlen=sizeof(addrto);
  //从广播地址发送消息
  int ret=sendto(s,smsg,lstrlen(smsg),0,(sockaddr*)&addrto,nlen);
  if(ret==SOCKET_ERROR)
  {
   printf("socket error %d\n", WSAGetLastError());
  }
  else
  {
   printf("%s ok\n", smsg);
  }
 }
 
 return 0;

接收端:关键是1)在该广播端口接受,2)设置SOCKET为可共享的REUSE类型,这样本机上多个接收端可以同时接受到该广播消息。这里可以同时运行该接收端的多个进程,看到多个进程都能收到来自发送端的消息。代码如下:

#include
#include
#pragma comment(lib,"ws2_32.lib")

int main()
{
 SOCKET s;
 sockaddr_in from, a;
 WSADATA wsdata;
 BOOL opt=TRUE;
  
 //启动SOCKET库,版本为1.1
 if(WSAStartup(MAKEWORD(1,1),  &wsdata)!=0)//进行WinSocket的初始化      
      
  printf("Can't initiates windows  socket! Program stop.\n");//初始化失败返回-1      
  return   -1;      
 }
 
 //用UDP初始化套接字
 s=socket(AF_INET,SOCK_DGRAM,0);
 //设置该套接字为可共享(重复使用),关键代码
 setsockopt(s,SOL_SOCKET,SO_REUSEADDR,(char FAR *)&opt,sizeof(opt));
 
 //用来绑定套接字,
 a.sin_family=AF_INET;
 a.sin_addr.s_addr=htonl(INADDR_ANY);
 a.sin_port=htons(7002);  //必须是同一个端口
 

//绑定该广播端口
 if(bind(s,(sockaddr FAR*)&a, sizeof(sockaddr_in))!=0)      
      
  printf("Can't bind socket to local port! Program stop.\n");//初始化失败返回-1      
  return     -1;      
  
   
 char buf[1024];
 while(1)
 {
  Sleep(2000);
  int fromlength = sizeof(sockaddr_in);

  //从广播地址接收消息
  if((fromlength=recvfrom(s,buf,1024,0,(sockaddr FAR*)&from,&fromlength))
   ==SOCKET_ERROR)      
       
   printf("receive error %d\n", WSAGetLastError());      
   break;      
       
  buf[fromlength] = '\0';  
  printf("%s", buf); 
  ZeroMemory(buf,256);
 }
 
 return 0;

备注:以上代码使用VC6.0编译、链接、运行,测试通过。其他语言或者其他集成开发环境暂无测试。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值