我有两个程序正在运行(program1,program2),它们都在使用我初始化的套接字相互发送和接收UDP数据包。
我的问题是如果我从program1发送一个广播发送(TX)套接字,program2接收消息,但是如果我发送一个单播(指定到program2的IP)program2不接收消息。。。program1中的“sendto”函数返回正确数量的数据包,因此它正在发送数据包。
这对我来说毫无意义,因为ip在广播的网络掩码中。。。我的单播也应该有效?我还需要单播发送。
有人能告诉我我做错了什么吗?我相信我的插座设置正确,配置正确,否则它根本不会工作。我遇到麻烦的代码如下:
程序1发送:
if ( ip == INADDR_BROADCAST || ip == 0 )
{
addr.sin_addr.s_addr = htonl( bcast );
}
else
{
addr.sin_addr.s_addr = htonl( ip );
// If I comment above and uncomment below, program works.
//addr.sin_addr.s_addr = htonl( bcast );
}
addr.sin_port = htons( port );
ret = sendto( fd,
buf,
n,
flags,
addr,
addr_len );
我的socket1的一些配置是:
// Set up tx socket
s_addr.sin_family = AF_INET;
s_addr.sin_addr.s_addr = htonl( own_ip );
s_addr.sin_port = htons( 6060 );
程序2接收:
rx_len = recvfrom( fd,
&rx_msg,
sizeof ( rx_msg ),
0,
(struct sockaddr *)&c_addr,
&len );
我的socket2的一些配置是:
s_addr.sin_family = AF_INET;
// Must be INADDR_ANY to receive broadcasts
s_addr.sin_addr.s_addr = htonl( INADDR_ANY );
s_addr.sin_port = htons( 6070);
if ( (ret = bind( fd,
(struct sockaddr *)&s_addr,
sizeof (s_addr) )) != 0 )
最佳答案
您可能需要初始化sockaddr_in addr
结构的其余部分,就像您对套接字1所做的那样。
尝试:
if ( ip == INADDR_BROADCAST || ip == 0 )
{
addr.sin_addr.s_addr = htonl( bcast );
}
else
{
addr.sin_family = AF_INET;
addr.sin_port = htons(6070);
inet_pton(AF_INET, ip, &addr.sin_addr.s_addr);
memset(addr.sin_zero, 0, sizeof(addr.sin_zero));
}
另外,请注意,根据inet_pton指南,我使用Beej's填充地址成员(这是我用来了解网络套接字的主要资源)。为此,您需要
#include <arpa/inet.h>
(如果您还没有)。希望这有帮助!
关于c - sendto广播有效,但单播不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37219993/