【发布时间】: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