发送端:关键是通过函数设置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编译、链接、运行,测试通过。其他语言或者其他集成开发环境暂无测试。