如何发送和接收UDP的广播消息?

m0772 2010-07-02 03:28:34
我按照网友的例子,接收端收不到任何消息,大家看看是什么问题啊,
发送端:
#include "stdafx.h"
#include <stdio.h>
#include <winsock.h>

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

int _tmain(int argc, _TCHAR* argv[])
{
WSADATA wsaData; //指向WinSocket信息结构的指针
SOCKET hSocket; //创建套接字
SOCKADDR_IN saUdpServ; //指向通信对象的结构体指针
BOOL fBroadcast = TRUE; //用于setsockopt(),表示允许
char sendBuff[800]; //缓冲区存放发送的数据
int ncount=0; //用于显示消息数目
//*************************** 第一步初始化Winsock *****************************//
if(WSAStartup(MAKEWORD( 1, 1 ), &wsaData )!=0) //进行WinSocket的初始化
{
printf("Can't initiates windows socket!Program stop.\n");//初始化失败返回-1
return -1;
}
//******************** 第二步建立一个数据报类型的UDP套接字 ******************//
hSocket=socket(PF_INET,SOCK_DGRAM,0);

// setsockopt函数用于设置套接口选项
// 采用广播形式须将第三个参数设置为SO_BROADCAST
setsockopt ( hSocket,SOL_SOCKET,SO_BROADCAST, (CHAR *)&fBroadcast, sizeof (BOOL) );

/*
SOCKADDR_IN addrUDP = { 0 };
addrUDP.sin_family = AF_INET;
addrUDP.sin_port = htons(0);
addrUDP.sin_addr.s_addr = htonl(INADDR_ANY);

if (bind(sockListener, (SOCKADDR *) &addrUDP, sizeof(addrUDP)) != 0)
{
return -1;
}
*/
// 参数设置,注意要将IP地址设为INADDR_BROADCAST,表示发送广播UDP数据报
saUdpServ.sin_family = AF_INET;
saUdpServ.sin_addr.s_addr = inet_addr("255.255.255.255"); //htonl ( INADDR_BROADCAST );
saUdpServ.sin_port = htons (7001); //发送用的端口,可以根据需要更改

while(1) //循环发送数据
{
sprintf(sendBuff,"Send:message%d",ncount++); //将ncount的值放入字符串senBuff中
//********************** 第三步使用sendto函数进行通信 *************************//
int ret = sendto ( hSocket, sendBuff, strlen (sendBuff), 0, (SOCKADDR *) &saUdpServ, sizeof ( SOCKADDR_IN ));
printf("%s[ret=%d]\n",sendBuff,ret); //将要广播的数据串输出
Sleep(1000);
}
//********************* 第四步关闭socket ***************************************//
closesocket(hSocket); //关闭监听socket
WSACleanup();

return 0;
}



接收端:
// UdpRecver.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <stdio.h>
#include<winsock.h>
#include <conio.h>

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

int _tmain(int argc, _TCHAR* argv[])
{
WSADATA wsaData; //指向WinSocket信息结构的指针
SOCKET hSocket;
SOCKADDR_IN sin,saClient; //设置两个地址,sin用来绑定
BOOL fBroadcast = TRUE;
//saClient用来从广播地址接收消息
char cRecvBuff[800]; //定义接收缓冲区
int nSize,nbSize;
int iAddrLen=sizeof(saClient);

if(WSAStartup(MAKEWORD( 1, 1 ), &wsaData )!=0) //进行WinSocket的初始化
{
printf("Can't initiates windows socket!Program stop.\n");//初始化失败返回-1
return -1;
}

hSocket = socket(AF_INET, SOCK_DGRAM,0);

setsockopt ( hSocket,SOL_SOCKET,SO_BROADCAST, (CHAR *)&fBroadcast, sizeof (BOOL) );
//int nTimeout = 1000; // 设置超时一秒
//setsockopt(sockListener, SOL_SOCKET, SO_RCVTIMEO, (char *) &nTimeout, sizeof(nTimeout));

sin.sin_family = AF_INET;
sin.sin_port = htons(7001); //发送端使用的发送端口,可以根据需要更改
sin.sin_addr.s_addr = htonl(INADDR_ANY);

if(bind( hSocket, (SOCKADDR FAR *)&sin, sizeof(sin))!=0)
{
printf("Can't bind socket to local port!Program stop.\n");//初始化失败返回-1
return -1;
}
while(1)
{
nSize = sizeof ( SOCKADDR_IN );
if((nbSize=recvfrom (hSocket,cRecvBuff,800,0,
(SOCKADDR FAR *) &saClient,&nSize))==SOCKET_ERROR) //若接收失败则提示错误
{
printf("Recive Error\n");
//break;
}
else
{
cRecvBuff[nbSize] = '\0'; //字符串终止
printf("Recv:%s\n",cRecvBuff); //显示所接收到的字符串
}
}


return 0;
}

...全文
1313 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
flyingleo1981 2010-09-15
  • 打赏
  • 举报
回复
setsockopt ( hSocket,SOL_SOCKET,SO_BROADCAST, (CHAR *)&fBroadcast, sizeof (BOOL) );
客户端这句话去掉
alfwolf 2010-07-02
  • 打赏
  • 举报
回复
使用广播,把接收端放在其它机器上再测试。
查看一下系统或者杀毒软件的防火墙。
m0772 2010-07-02
  • 打赏
  • 举报
回复
在发送端
saUdpServ.sin_addr.s_addr = inet_addr("255.255.255.255"); //htonl ( INADDR_BROADCAST );
这一行如果设的是我IP地址,接收端就可以收到,但是如果是255.255.255.255或htonl ( INADDR_BROADCAST );
接收端没有任何反应,大家看看问题在哪儿,是哪儿写错了吗?

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧