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配置?
请大家指教。
...全文
914 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 是不处理 广播包的。
1.Docker入门    1.1 Docker为什么火    1.2 Docker是什么    1.3 为什么要使用Docker    1.4 Docker与虚拟化区别    1.5 Docker Engine    1.6 Docker 体系结构    1.7 Docker 应用场景2.Docker安装    2.1 安装Docker2.1.1 调整镜像源从国内获取2.1.2 调整docker数据存储位置    2.2 如何快速运行一个容器3.Docker镜像    3.1 什么是镜像?    3.2 镜像能干什么?    3.3 如何使用镜像运行容器    3.4 镜像的基本操作。搜索、下载、查看、导入、导出、删除、上传4.Docker容器    4.1 什么是容器    4.2 容器能运行什么    4.3 启动第一个容器    4.4 容器运行的参数含义    4.5 如何运行一个自启动的容器    4.6 容器暴露    4.7 容器的整个生命周期5.Docker数据管理    5.1 数据持久化介绍    5.2 数据持久化-Data Volume (db)    5.3 数据持久化-Bind Mounting  ( web )6.Docker镜像构建    6.1 如何将运行的容器打包成镜像    6.2 如何实现自动化构建镜像    6.3 Dockerfile介绍    6.4 Dockerfile语法    6.5 dockerfile构建-案例1    6.5 dockerfile构建-案例2    6.7 dockerfile构建-案例3    6.8 dockerfile构建-案例4 (搞清楚ENTRYPOINT与CMD之间的关系与区别)7.Docker私有仓库    7.1 什么是私有仓库    7.2 为什么要有私有仓库    7.3 私有仓库种类    7.2 搭建私有仓库registry     7.3 为registry添加basic认证    7.3 如何将本地镜像存放私有仓库    7.4 如何获取私有仓库的docker镜像    7.5 企业级私有仓库harbor https    7.6 实战a主机推送镜像至仓库,b主机拉取镜像启动为容器8.Docker网络    8.1 docker容器互联是什么?--link    8.2 docker容器互联项目实践( python )    8.3 docker网络模式 ( bridge、host、container、none )9.Docker单机编排    9.1 Compose基本介绍    9.2 Compose三大概念   project(services、volumes、networks)    9.3 Compose编排博客系统    9.4 Compose编排Python-web    9.5 Compose实现水平扩展    9.6 Compose实现负载均衡    9.7 Compose编排投票系统 (python、node、java、db、redis)10.Docker图形化与监控    10.1 docker图形工具 Portainer    10.2 docker监控工具 cAdvisor

23,121

社区成员

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

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