导航
  • 主页
  • 系统维护与使用
  • 应用程序开发
  • 内核源代码
  • 驱动程序开发
  • CPU和硬件区
  • UNIX文化
  • Solaris
  • Power Linux
  • 问答

为何广播失败?

wmrwinhap 2004-06-29 12:31:27
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
#include <errno.h>

int main()
{
int sock=socket(PF_INET,SOCK_DGRAM,0);
if(sock==-1) printf("Create socket error !\r\n");
else {
struct sockaddr_in addr;
int nBroadcast=1; // enable broadcast
setsockopt(sock,SOL_SOCKET,SO_BROADCAST,&nBroadcast,sizeof(int));
addr.sin_family=PF_INET;
addr.sin_addr.s_addr=0;
addr.sin_port=htons(6068);
if(bind(sock,(struct sockaddr*)&addr,sizeof(struct sockaddr))==-1) printf("Bind on port 68 fail.\r\n");
else {
char buf[256];
int nLen;
addr.sin_family=PF_INET;
addr.sin_addr.s_addr=htonl(INADDR_BROADCAST);
addr.sin_port=htons(1067);
strcpy(buf,"send some thing through broadcast udp !");
nLen=sendto(sock,buf,strlen(buf),0,(struct sockaddr*)&addr,sizeof(struct sockaddr));
if(nLen<0) printf("sendto fail. errno=%d\r\n",errno);
else printf("sendto return %d\r\n",nLen);
close(sock);
}
}
return 0;
}

结果为何发送失败?
errno等于101(网络不可到达?)


...全文
75 点赞 收藏 5
写回复
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
wmrwinhap 2004-06-30
谢谢,我也找到问题了。

你说的没错,我的网段是168.168.0.0,没设置网关的话,只能向本子网168.168.255.255发包才能成功。设置了默认网关的话,才可以向全网广播。
回复
bshawk 2004-06-29
看看你的INADDR_BROADCAST是多少?!printf看一下??
回复
blankman 2004-06-29
可能是网段不对,你看看你的网络地址是多少

网络地址 = IP地址&子网掩码
192.168.0.0 = 192.168.0.1 & 255.255.255.0

如果像例子那样的花,你发送的时候应该是 192.168.0.255
不同的子网是收不到的,除非你设置了混杂模式来抓包

你试一下
回复
wmrwinhap 2004-06-29
急! 在线等待 !
回复
wmrwinhap 2004-06-29
是 0xFFFFFFFF 没错呀, htonl(INADDR_BROADCAST)也等于0xFFFFFFFF,没错的。
我是发广播,不是发向某个固定地址的
回复
发动态
发帖子
Linux/Unix社区
创建于2007-08-27

2.0w+

社区成员

Linux/Unix社区 应用程序开发区
申请成为版主
社区公告
暂无公告