新手求助:socket如何发送UDP广播报255.255.255.255

xiaoxiaodianzi 2010-08-14 11:33:00
我的代码如下。
 int error = 0;
SockServer = socket(AF_INET, SOCK_DGRAM,0);

addrServer.sin_addr.S_un.S_addr = ::htonl(INADDR_ANY);
addrServer.sin_family = AF_INET;
addrServer.sin_port = ::htons(0);

error = ::bind(SockServer, (SOCKADDR*)&addrServer,sizeof(SOCKADDR));

if(error == SOCKET_ERROR)
{
error = WSAGetLastError();
MessageBox(_T("网络不可用!"));
}

SOCKADDR_IN RecvAddr;
RecvAddr.sin_family = AF_INET;
RecvAddr.sin_port = ::htons(8801);
RecvAddr.sin_addr.S_un.S_un_b.s_b1 = 255;
RecvAddr.sin_addr.S_un.S_un_b.s_b2 = 255;
RecvAddr.sin_addr.S_un.S_un_b.s_b3 = 255;
RecvAddr.sin_addr.S_un.S_un_b.s_b4 = 255;
char yes = 1;
error = setsockopt(SockServer, SOL_SOCKET, SO_BROADCAST, &yes, sizeof(yes));

if(error == SOCKET_ERROR)
{
MessageBox(_T("设置错误!"));
}

error = ::sendto(SockServer,
(char *)&m_senddata,
sizeof(m_senddata),
0,
(SOCKADDR*)&RecvAddr,
sizeof(SOCKADDR));
if(error == SOCKET_ERROR)
{
MessageBox(_T("发送错误"));
return ;
}
...全文
6308 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
Eleven 2010-09-08
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 xiaoxiaodianzi 的回复:]
引用 17 楼 visualeleven 的回复:
C/C++ code

//每隔3秒钟向端口号5050不断的发送广播数据

SOCKET s = socket(AF_INET, SOCK_DGRAM, 0);
BOOL bBroadcast = TRUE;
setsockopt(s, SOL_SOCKET, SO_BROADCAST, (char*)&bBroad……
[/Quote]
发送出去应该没问题。。。
xiaoxiaodianzi 2010-09-08
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 visualeleven 的回复:]
C/C++ code

//每隔3秒钟向端口号5050不断的发送广播数据

SOCKET s = socket(AF_INET, SOCK_DGRAM, 0);
BOOL bBroadcast = TRUE;
setsockopt(s, SOL_SOCKET, SO_BROADCAST, (char*)&bBroadcast, sizeof(bBroadcast));
SOC……
[/Quote]

你试过了吗? 可以发送出来吗? 我这边没有检测到也!! 难道被路由器给拦截了?
Eleven 2010-09-07
  • 打赏
  • 举报
回复

//每隔3秒钟向端口号5050不断的发送广播数据

SOCKET s = socket(AF_INET, SOCK_DGRAM, 0);
BOOL bBroadcast = TRUE;
setsockopt(s, SOL_SOCKET, SO_BROADCAST, (char*)&bBroadcast, sizeof(bBroadcast));
SOCKADDR_IN bcast;
bcast.sin_family = AF_INET;
bcast.sin_port = htons(5050);
bcast.sin_addr.S_un.s_addr = INADDRY_BROADCAST;
_tprintf(_T("Start send broadcast data...\n"));
char szText[] = "This is broadcast...";
while(TRUE)
{
sendto(s, szText, strlen(szText), 0, (LPSOCKADDR)&bcast, sizeof(bcast));
Sleep(3000);
}
xiaoxiaodianzi 2010-09-03
  • 打赏
  • 举报
回复
UP 顶上去
xiaoxiaodianzi 2010-08-20
  • 打赏
  • 举报
回复
我顶上去!!!
zyf9351 2010-08-19
  • 打赏
  • 举报
回复
期待中学习一下。
xiaoxiaodianzi 2010-08-19
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 ljhnew 的回复:]
你为什么一定要发送255.255.255.255的广播报文呢?有多大的需求?一般发广播是发子网广播报文。
在带操作系统的单片机中,很难发送这样的报文,因为这样的报文很难从应用层传输到IP层上,这个由协议栈和路由表等限制。很多不带操作系统的单片机是直接对网络接口填写IP地址和各种参数,而底层未对IP协议作严格的处理,所以你可以看到很多255.255.255.255的报文。而255.255.255.……
[/Quote]
嗯,是这样的 我一个配置软件需要配置下面很多嵌入式设备。因为目前无法确定以后设备工作的网段。所以发送广播报是最省事,也最保险的一个做法。我现在这边的应用软件是可以接收到单片机发送上来的广播报。就是无法发送出去。
Wenxy1 2010-08-18
  • 打赏
  • 举报
回复
1. 检查setsockopt()函数的返回值是:
Return Values
If no error occurs, setsockopt returns zero. Otherwise, a value of SOCKET_ERROR is returned, and a specific error code can be retrieved by calling WSAGetLastError.
0才表示成功。

其它的socket函数也一样要检查返回值,按照MSDN上说明来做!

2. 用wireshark工具捕捉网络数据包看看是否有广播发出。

ljhnew 2010-08-18
  • 打赏
  • 举报
回复
你为什么一定要发送255.255.255.255的广播报文呢?有多大的需求?一般发广播是发子网广播报文。
在带操作系统的单片机中,很难发送这样的报文,因为这样的报文很难从应用层传输到IP层上,这个由协议栈和路由表等限制。很多不带操作系统的单片机是直接对网络接口填写IP地址和各种参数,而底层未对IP协议作严格的处理,所以你可以看到很多255.255.255.255的报文。而255.255.255.255报文一般都是特殊协议来使用的,如ARP、DHCP等。
而对于255.255.255.255的报文,你的应用软件能看到吗?只有用抓包软件通过在网卡上设置混杂模式,才可以监视到该报文,而普通的这种受限广播报文在协议栈内部自动丢掉了。对于一般的应用,完全没有必要用这种报文。
xiaoxiaodianzi 2010-08-18
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 zlixus 的回复:]
SOCKET的广播通信方法

#include <stdio.h>
#include <winsock2.h>
int main()
{
SOCKET s;
WSADATA wsd;
if (WSAStartup(MAKEWORD(2, 2), &wsd) != 0)
{
printf("wsastartup failed ! [%ld]\n", WSAGetLa……
[/Quote]

你试过了 可以吗? 我这里试了下 不行也 可以正常执行发送语句,就是没有东西出来。
zlixus 2010-08-16
  • 打赏
  • 举报
回复
SOCKET的广播通信方法

#include <stdio.h>
#include <winsock2.h>
int main()
{
SOCKET s;
WSADATA wsd;
if (WSAStartup(MAKEWORD(2, 2), &wsd) != 0)
{
printf("wsastartup failed ! [%ld]\n", WSAGetLastError());
return 0;
}

s = socket(AF_INET, SOCK_DGRAM, 0);
if (s == INVALID_SOCKET)
{
printf("create socket failed ! [%ld]\n", WSAGetLastError());
WSACleanup();
return 0;
}

bool opt = true;
if (setsockopt(s, SOL_SOCKET, SO_BROADCAST, (char FAR*)&opt, sizeof(opt)) == OCKET_ERROR)
{
printf("setsockopt SO_BROADCAST failed ! [%ld]\n", WSAGetLastError());
closesocket(s);
WSACleanup();
return 0;
}

int nTimeOut = 3000;

if (setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, (char*)&nTimeOut, sizeof(nTimeOut) == SOCKET_ERROR))
{
printf("setsockopt SO_RCVTIMEO failed ! [%ld]\n", WSAGetLastError());
closesocket(s);
WSACleanup();
return 0;
}

sockaddr_in addr_local, addr_sendto, addr_sender;

addr_local.sin_family = AF_INET;
addr_local.sin_port = htons(0);
addr_local.sin_addr.s_addr = htonl(INADDR_ANY);
if (bind(s, (SOCKADDR*)&addr_local, sizeof(addr_local)) == SOCKET_ERROR)
{
printf("bind() failed ! [%ld]\n", WSAGetLastError());
WSACleanup();
return 0;
}

addr_sendto.sin_family = AF_INET;
//12345是服务端接受广播消息的端口号,可自行设定。
addr_sendto.sin_port = htons(12345);
addr_sendto.sin_addr.s_addr = INADDR_BROADCAST;
char szMsg[50] = "";
strcpy(szMsg, "testing testing ...");
for (int i = 0; i < 2; i ++)
{
int nRet = sendto(s, szMsg, 50, 0, (sockaddr*)&addr_sendto, sizeof(addr_sendto));
if (nRet == SOCKET_ERROR)
{
printf("sendto() failed ! [%ld]\n", WSAGetLastError());
break;
}
printf("ok...\n");
char recvbuf[1024] = "";
DWORD dwLength = 1024;
int nSenderSize = sizeof(addr_sender);
int ret = recvfrom(s, recvbuf, dwLength, 0, (SOCKADDR*)&addr_sender, &nSenderSize);
if (ret == SOCKET_ERROR)
{
DWORD dwErr = WSAGetLastError();
printf("recvfrom() failed ! [%ld]\n", dwErr);
if (dwErr == 10060) //timeout
{
continue;
}
break;
}
else if (ret == 0)
{
break;
}
else
{
recvbuf[ret] = '\0';
printf("[%s] sent me: %s\n", inet_ntoa(addr_sender.sin_addr), recvbuf);
break;
}

}

closesocket(s);

WSACleanup();
return 0;
}

=========================
局域网中发送广播消息

在socket初始化的时候

地址初始化为 INADDR_BROADCAST ,就是广播了

例如:
sock.sin_addr.s_addr = htonl ( INADDR_BROADCAST );

周药师 2010-08-16
  • 打赏
  • 举报
回复
0-1024的端口是系统用 或者一些知名的软件占用了
你的端口应该设置为1024-65535之间
xiaoxiaodianzi 2010-08-16
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 ljhnew 的回复:]
针对255.255.255.255这个地址,实际上是个受限的广播地址,在操作系统上,一般用应用层上的UDP发送,是发不出这个地址的。你可以容易发送一个针对指向网络的广播:192.168.1.255。而实际上,我们也基本用不到4个255地址的广播报文。像ARP、DHCP这样的广播报文,是系统自身的特殊协议数据包。所以不用在应用层上试图发送4个255的受限报文。

在一些单片机上,可以直接在发送的……
[/Quote]
确实我很容易发送其他网段的广播报,像10.255.255.255和192.168.1.255。 无法发送255.255.255.255。但是我可以收到单片机发送过来的。 而且我看了其他软件也是可以发送的。既然别人可以发送,我应该也可以吧!! 只是不知道如何实现而已。。
ljhnew 2010-08-15
  • 打赏
  • 举报
回复
针对255.255.255.255这个地址,实际上是个受限的广播地址,在操作系统上,一般用应用层上的UDP发送,是发不出这个地址的。你可以容易发送一个针对指向网络的广播:192.168.1.255。而实际上,我们也基本用不到4个255地址的广播报文。像ARP、DHCP这样的广播报文,是系统自身的特殊协议数据包。所以不用在应用层上试图发送4个255的受限报文。

在一些单片机上,可以直接在发送的原始数据包中填写4个255的地址。你用抓包软件可以看到这些数据包,但是在应用层上,你基本上收不到这些报文。
xiaoxiaodianzi 2010-08-14
  • 打赏
  • 举报
回复
现在的问题是 编译 运行都没有提示错误!! 就是我用网络分析软件都检测不到, 但可以检测到别人用单片机发送上来的广播包
xiaoxiaodianzi 2010-08-14
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 teleinfor 的回复:]
你最好不要使用端口号 = 0
[/Quote]

设置端口为0 不是让系统自动分配端口号吗?
teleinfor 2010-08-14
  • 打赏
  • 举报
回复
你最好不要使用端口号 = 0
a252049415 2010-08-14
  • 打赏
  • 举报
回复
我也遇到同样的问题,期待答案!

18,357

社区成员

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

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