UDP recvfrom()导致问题

时间:2011-11-10 21:26:52

标签: c++ visual-studio networking udp

我一直在尝试从客户端接收数据包但是在recvfrom()过程中我认为我做错了...

我有什么名为DataPacket,它只是一个带有一些x&的类。 y值

客户执行以下操作......

int UDPCon::Send(DataPacket dPacket)
{
    int n = sendto(m_Socket,  (char *)&dPacket, PACKETSIZE, 0, (struct sockaddr *)&m_RemoteAddress, m_SocketAddressSize);   
    return n;   
}

服务器收到

int CUDPSocket::Receive(DataPacket *data)
{
    int n = recvfrom(m_Socket, (char *) &data, PACKETSIZE, 0, (struct sockaddr *)&m_RemoteAddress, &m_SocketAddressSize);
    return n;
}

当我只是在没有回送的情况下发送char时,这曾经工作,所以代码确实有效。我认为我做错了指针,只要recvfrom()将数据放入“数据”,DataPacket“数据”就变成“表达式无法评估”

我真的很感激任何帮助

由于

4 个答案:

答案 0 :(得分:0)

您似乎正在发送一个结构,或至少在DataPacket中发送原始数据。在这种情况下,请将服务器代码更改为

int CUDPSocket::Receive(DataPacket *data)
{
    int n = recvfrom(m_Socket, (char *) data, PACKETSIZE, 0, (struct sockaddr *)&m_RemoteAddress, &m_SocketAddressSize);
    return n;
}

虽然,您应该显示DataPacket和PACKETSIZE的声明,但上述内容可能会或可能不会执行您需要执行的操作。

答案 1 :(得分:0)

您的Receive函数接收指向DataPacket的指针。但是,当您致电recvfrom时,您正在传递(char*) &data,这是指向的指针。这意味着你要将数据包数据写在指针之上,而不是写入它。

修复很简单,使用recvfrom调用(char*)data,以便recvfrom写入DataPacket而不是覆盖DataPacket指针。

答案 2 :(得分:0)

在接收器中data已经是一个指针,所以你使用& address-of运算符是一个错误(该表达式的结果是指针的地址)。

只需将接收者呼叫更改为

即可
int n = recvfrom(m_socket, (char *)data, ... );

将解决问题。

答案 3 :(得分:0)

在你的调用中,你将指针数据的地址传递给recvfrom,因此recvfrom正在写入存储指针变量数据的内存。您需要传递“(char *)data”而不是“(char *)& data”。