sendto广播有效,但单播没有

时间:2016-05-13 22:04:47

标签: c sockets networking network-programming

我有两个正在运行的程序(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 )

1 个答案:

答案 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>(如果您还没有)。

希望这有帮助!