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

时间:2022-12-15 15:19:15
我按照网友的例子,接收端收不到任何消息,大家看看是什么问题啊,
发送端:
#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;
}

3 个解决方案

#1


在发送端
saUdpServ.sin_addr.s_addr = inet_addr("255.255.255.255"); //htonl ( INADDR_BROADCAST );
这一行如果设的是我IP地址,接收端就可以收到,但是如果是255.255.255.255或htonl ( INADDR_BROADCAST );
接收端没有任何反应,大家看看问题在哪儿,是哪儿写错了吗?

#2


使用广播,把接收端放在其它机器上再测试。
查看一下系统或者杀毒软件的防火墙。

#3


setsockopt ( hSocket,SOL_SOCKET,SO_BROADCAST, (CHAR *)&fBroadcast, sizeof (BOOL) );
客户端这句话去掉

#1


在发送端
saUdpServ.sin_addr.s_addr = inet_addr("255.255.255.255"); //htonl ( INADDR_BROADCAST );
这一行如果设的是我IP地址,接收端就可以收到,但是如果是255.255.255.255或htonl ( INADDR_BROADCAST );
接收端没有任何反应,大家看看问题在哪儿,是哪儿写错了吗?

#2


使用广播,把接收端放在其它机器上再测试。
查看一下系统或者杀毒软件的防火墙。

#3


setsockopt ( hSocket,SOL_SOCKET,SO_BROADCAST, (CHAR *)&fBroadcast, sizeof (BOOL) );
客户端这句话去掉