Linux UDP server bind IP 不能接收广播数据

sliai 2016-02-02 04:41:32
最近在写一个简单的udp server, 发现一个很奇怪的问题。
Bind本地IP的时候如果设置成INADDR_ANY, 就可以收到包。但是如果设置成本地IP,就收不到包。
配置代码如下:
struct sockaddr_in ser_addr;
.....
bzero(&ser_addr, sizeof(ser_addr));
ser_addr.sin_family = AF_INET;
ser_addr.sin_addr.s_addr = htonl(INADDR_ANY);
ser_addr.sin_port = htons(PORT_NUM);
if(-1 == bind(server_socket_fd, (struct sockaddr *)&ser_addr, sizeof(ser_addr))) {
perror("bind error");
exit(1);
}
.......
如果将IP改成本地IP:
ser_addr.sin_addr.s_addr = inet_addr(“192.168.1.20”);
则收不到数据包。

另外,本地只有一个以太网卡,地址为:192.168.1.20

发送端的数据为广播包,使用tcpdump工具抓包如下:
IP 192.168.1.5.50005 > 255.255.255.255.50005: UDP, length 1340

难道对于广播包,只能使用INADDR_ANY的IP配置?
请大家指教。
...全文
1207 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
nswcfd 2016-02-04
  • 打赏
  • 举报
回复
匹配udp socket的一个必要非充分条件是: inet->rcv_saddr && inet->rcv_saddr != loc_addr(即udp->dest) 也就是说,如果socket的本地地址非0,必须跟报文的目的地址匹配。 PS,SO_BROADCAST只控制发送,跟接收无关。
常书 2016-02-04
  • 打赏
  • 举报
回复
楼主说的是个普遍现像,参考:http://blog.csdn.net/jiangxinyu/article/details/7869128 不用纠结这样的问题,要接收广播包,就bind INADDR_ANY
sliai 2016-02-03
  • 打赏
  • 举报
回复
引用 2 楼 wuhanqing 的回复:
应该是的,你用 本地IP 是不处理 广播包的。
谢谢。 有资料详细说明吗?
sliai 2016-02-03
  • 打赏
  • 举报
回复
顶一下,有人知道吗?
hanqingwu 2016-02-03
  • 打赏
  • 举报
回复
应该是的,你用 本地IP 是不处理 广播包的。

23,214

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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