C++ 未接收到UDP广播
我对网络编程非常陌生,发现其中很少有人难以理解 我有一个工作程序,它向本地设备发送消息,让它知道它的工作方式就像保持活力。现在我想更改为广播,以便可以在本地任何地方检查其状态。因此,在看到两个在线示例后,我将工作代码更改为如下所示C++ 未接收到UDP广播,c++,c,udp,udpclient,C++,C,Udp,Udpclient,我对网络编程非常陌生,发现其中很少有人难以理解 我有一个工作程序,它向本地设备发送消息,让它知道它的工作方式就像保持活力。现在我想更改为广播,以便可以在本地任何地方检查其状态。因此,在看到两个在线示例后,我将工作代码更改为如下所示 //inet_aton(pIPAddress, &(TxAddr.sin_addr)); //working TxAddr.sin_addr.s_addr = htonl(INADDR_BROADCAST); //NOT WORKING 广播工作还有什么需要
//inet_aton(pIPAddress, &(TxAddr.sin_addr)); //working
TxAddr.sin_addr.s_addr = htonl(INADDR_BROADCAST); //NOT WORKING
广播工作还有什么需要补充的吗请指教。我的完整程序可以在下面找到。我也使用了wireshark,但在广播时没有发现UDP数据包。但当我使用特定IP时,我可以
/// Rx buffer size
static int RxBufSize = UDP_RX_BUF_SIZE;
int Udp::UDPInit (tConfigIniData *pConfig)
{
pIPAddress = pConfig->pIPAddress;
TxPort = pConfig->UdpTxPort;
// Tx socket
TxSkt = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (TxSkt == -1)
{
goto Exit;
}
else
{
Log (EVENT|TEXTFILE, UDP, "Successful tx socket creation\n");
}
Exit:
Log (EVENT|TEXTFILE, UDP, "() = %d\n", TxSkt);
return TxSkt;
}
int Udp::UDPSend (tUdpInfo _udpInfo)
{
int Ret = 0;
struct sockaddr_in TxAddr = {0};
TxAddr.sin_family = AF_INET;
TxAddr.sin_port = htons(TxPort);
//TxAddr.sin_addr.s_addr = htonl(INADDR_BROADCAST);
inet_aton(pIPAddress, &(TxAddr.sin_addr)); //working
// And send
if (TxSkt != -1)
{
Log (EVENT|TEXTFILE, UDP, "Sending %d bytes: %p\n", sizeof(_udpInfo), &_udpInfo);
ssize_t Res = sendto(TxSkt, (const void*)(&_udpInfo), sizeof(_udpInfo), 0, (const struct sockaddr *)&TxAddr, sizeof(TxAddr));
if (Res < 0)
{
Log (EVENT|TEXTFILE|ERROR|CONSOLE, UDP,"ERR: Failed to write to TX socket (%d,%s)\n", errno, strerror(errno));
}
Ret = 0;
}
else
{
// No socket, indicate error
Log (EVENT|TEXTFILE|ERROR|CONSOLE, UDP, "ERR: No Tx Socket exists\n");
Ret = -EBADFD;
}
Log (EVENT|TEXTFILE, UDP, "()\n");
// TxPortumber++;
// cout<< "port NUmber used : "<<TxPortumber<<"\n";
return Ret;
}
void Udp::UDPDeinit (int UDPFd)
{
Log (EVENT|TEXTFILE, UDP, "(UDPFd %d)\n", UDPFd);
// tidy up interfaces
int Res = close(UDPFd);
if (Res < 0)
{
Log (EVENT|TEXTFILE|ERROR|CONSOLE, UDP, "UDP: Close Failed: %d, %s - %s\n", errno, strerror(errno), __func__);
}
}
///Rx缓冲区大小
静态int RxBufSize=UDP_RX_BUF_SIZE;
int Udp::UDPInit(tConfigIniData*pConfig)
{
pIPAddress=pConfig->pIPAddress;
TxPort=pConfig->UdpTxPort;
//Tx插座
TxSkt=插座(AF_INET、SOCK_DGRAM、IPPROTO_UDP);
如果(TxSkt==-1)
{
转到出口;
}
其他的
{
日志(事件|文本文件,UDP,“成功创建tx套接字\n”);
}
出口:
日志(事件|文本文件,UDP,“()=%d\n”,TxSkt);
返回TxSkt;
}
intudp::UDPSend(tUdpInfo\u udpInfo)
{
int-Ret=0;
TxAddr={0}中的结构sockaddru;
TxAddr.sin_family=AF_INET;
TxAddr.sinu端口=htons(TxPort);
//TxAddr.sin_addr.s_addr=htonl(INADDR_广播);
inet_aton(pIPAddress,&(TxAddr.sin_addr));//正在工作
//发送
如果(TxSkt!=-1)
{
日志(事件|文本文件,UDP,“发送%d字节:%p\n”,大小(_udpInfo)和_udpInfo);
ssize_t Res=sendto(TxSkt,(const void*)(&u udpInfo),sizeof(&u udpInfo),0,(const struct sockaddr*)&TxAddr,sizeof(TxAddr));
如果(Res<0)
{
日志(事件|文本文件|错误|控制台,UDP,“错误:无法写入TX套接字(%d,%s)\n)”,错误号,strerror(错误号));
}
Ret=0;
}
其他的
{
//无套接字,指示错误
日志(事件|文本文件|错误|控制台,UDP,“错误:不存在Tx套接字\n”);
Ret=-EBADFD;
}
日志(事件|文本文件,UDP,“()\n”);
//txportnumber++;
//cout提示。当您收到错误时,显示它,例如使用peror()
,或通过strerror()
记录它。否则,调试只是一个猜测游戏。