发送端:
#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 );
接收端没有任何反应,大家看看问题在哪儿,是哪儿写错了吗?
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 );
接收端没有任何反应,大家看看问题在哪儿,是哪儿写错了吗?
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) );
客户端这句话去掉
客户端这句话去掉