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

10-10 21:31