我有两个正在运行的程序(program1,program2),它们都是使用我初始化的套接字发送和接收UDP数据包。
我的问题是如果我从program1向TRANSMIT(TX)套接字发送广播,program2接收消息但是如果我发送单播(指定IP到program2)program2没有收到消息...“sendto “program1中的函数返回时发送的数据包数量正确,因此将其发送出去。
这对我没有意义,因为ip是广播的网络掩码......我的单播也应该工作吗?我也需要单播tx才能工作。
有人能让我知道我做错了什么吗?我相信我正确设置了我的套接字并正确配置它或者根本不起作用。我遇到麻烦的代码如下:
Program1 Tx:
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 );
Program2 Rx:
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 )
答案 0 :(得分: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>
(如果您还没有)。
希望这有帮助!