bool bOpt = true;
//打开广播选项
setsockopt(conn_sock, SOL_SOCKET, SO_BROADCAST, (char*)&bOpt, sizeof(bOpt));
// 设置发往的地址
SOCKADDR_IN saUdpServ;
memset(&saUdpServ, 0, sizeof(saUdpServ));
saUdpServ.sin_family = AF_INET;
saUdpServ.sin_addr.S_un.S_addr = htonl(INADDR_BROADCAST); // 套接字地址为广播地址
//saUdpServ.sin_addr.S_un.S_addr = inet_addr("192.168.0.11");
saUdpServ.sin_port = htons(6789);
以上代码放到win系统中没有问题,但是搬到linux系统种就出现问题了。
问题可能有两个:
1 linux有多个网卡,你需要指定某个网卡的ip,告诉socket由指定的ip发送消息
2 问题出在很骚的一个地方:
saUdpServ.sin_addr.S_un.S_addr = htonl(INADDR_BROADCAST); // 套接字地址为广播地址
修改的linux版本的代码
unsigned long addr = inet_addr("192.168.137.191");
setsockopt(serverSocket, SOL_SOCKET, SO_REUSEADDR | SO_BROADCAST, &addr, sizeof(addr));
struct sockaddr_in local;
memset(&local, 0, sizeof(local));
local.sin_family = AF_INET;
local.sin_port = htons(6789);
local.sin_addr.s_addr = inet_addr("192.168.137.255");
把 htonl(INADDR_BROADCAST) 修改为 inet_addr(“192.168.137.255”)
这个192.168.137.255 代表什么呢?参考下图吧。
以上就解决问题了。