【发布时间】:2011-03-18 04:44:38
【问题描述】:
我正在使用作为发现协议的一部分侦听 UDP 消息的 Linux 服务器。我的监听代码如下:
rcd = ::select(
socket_handle + 1,
&wait_list,
0, // no write
0, // no error
&timeout);
if(rcd > 0)
{
if(FD_ISSET(socket_handle,&wait_list))
{
struct sockaddr address;
socklen_t address_size = sizeof(address);
len = ::recvfrom(
socket_handle,
rx_buff,
max_datagram_size,
0, // no flags
&address,
&address_size);
if(len > 0 && address.sa_family == AF_INET)
{
struct sockaddr_in *address_in =
reinterpret_cast<struct sockaddr_in *>(&address);
event_datagram_received::cpost(
this,
rx_buff,
rcd,
ntohl(address_in->sin_addr.s_addr),
ntohs(address_in->sin_port));
}
}
}
与此同时,我编写了一个传输 UDP 消息的 Windows 客户端。我已经使用wireshark 验证了消息正在以正确的格式和长度(五个字节)传输。但是,当我检查 recvfrom() 的返回值时,该值始终为 1。我的接收缓冲区 (max_datagram_size) 的大小设置为 1024。我们得到的数据包的一个字节似乎具有正确的值。我的问题是:为什么我没有得到所有预期的字节?
以防万一,我的 Linux 服务器在 VirtualBox 虚拟机中的 Debian 5 下运行。
【问题讨论】:
-
你在代码的什么地方看到了 1 的长度?您的
event_datagram_received::cpost似乎没有处理len变量? -
是
max_datagram_size1 还是5? -
你能说明你是如何在发送者和接收者中设置套接字的吗?
-
nos 的评论很中肯,我觉得很傻。我使用的是 select() 的返回值,而不是 recvfrom() 的返回值。如果要形成该注释作为答案,我将很乐意接受。