gpt4 book ai didi

c - sendto 广播有效但单播无效

转载 作者:太空宇宙 更新时间:2023-11-04 04:30:12 26 4
gpt4 key购买 nike

我有 2 个程序在运行(程序 1、程序 2),它们都使用我初始化的套接字相互发送和接收 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 )

最佳答案

您可能需要初始化其余的 sockaddr_in addr结构,就像您对 socket 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com