1,问题
最近做一个小的UDP广播服务,用于提供客户端寻找主机服务。最开始UDP服务端创建的socket为一般的UDPsocket,绑定到广播端口,地址为本机地址INADDR_ANY,用此socket接收客户端的广播,然后根据recvfrom接口获得的客户端地址,定向发送UDP包到客户端;
客户端主机搜索请求为,创建设置为SO_BROADCAST的socket,并绑定到本机地址INADDR_ANY,发送寻找主机广播到局域网广播地址,等待接收广播的回复;
但是,客户端仅能接收自己发出的广播包,一直接收不到主机的回复。
2,解决
由于主机接收到客户端的广播后,向客户端发送的是UDP单播,而客户端等待接收的socket绑定在广播端口,所以客户端内核接收到UDP单播包,但是找不到处理它的进程,因此,内核进程很有可能将它抛弃。所以,主机UDP广播服务端将发送回复信息的地址指定为广播地址,设置主机socket为SO_BROADCAST,问题解决。
3, 代码:
// Broadcast Server
#include <sys/socket.h>
#include <netinet/in.h>
int main()
{
int sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
int bl = 1;
if (-1 == setsockopt(so