【问题标题】:sendto broadcast works but unicast doesn'tsendto 广播有效,但单播无效
【发布时间】:2016-09-10 05:46:12
【问题描述】:

我有 2 个程序正在运行(program1、program2),它们都使用我初始化的套接字相互发送和接收 UDP 数据包。

我的问题是,如果我从 program1 的 TRANSMIT(TX) 套接字发送广播,program2 会收到该消息,但如果我发送单播(将 IP 指定给 program2)program2 不会收到消息...“sendto " program1 中的函数返回正确数量的数据包,因此它正在发送出去。

这对我来说毫无意义,因为 ip 在广播的网络掩码中......我的单播也应该工作?我也需要单播 tx 才能工作。

有人可以告诉我我做错了什么吗?我相信我正确设置了我的套接字并正确配置了它,否则它根本不起作用。我遇到问题的代码如下:

程序 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 )

【问题讨论】:

  • 如果不知道在失败情况下ip 的值,就不可能回答您的问题。显然它有问题。

标签: c sockets networking network-programming


【解决方案1】:

您可能需要初始化 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>(如果您还没有的话)。

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-31
    • 2021-03-24
    • 1970-01-01
    • 2013-04-03
    • 2017-09-05
    • 1970-01-01
    • 1970-01-01
    • 2019-01-03
    相关资源
    最近更新 更多