【问题标题】:UDP recvfrom() causing issuesUDP recvfrom() 导致问题
【发布时间】:2011-11-10 21:26:51
【问题描述】:

我一直在尝试从客户端接收数据包,但是在 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;
}

当我只是简单地发送字符而不进行强制转换时,这曾经有效,因此代码确实有效。我认为我对指针做错了,只要 recvfrom() 将数据放入“数据”,DataPacket“数据”就变成“无法评估表达式”

非常感谢任何帮助

谢谢

【问题讨论】:

  • DataPacket 是一个带有 int x, y 的类;差不多就是这样。这在上课之前确实有效,唯一的区别是我传递了一个指针,以便编辑值。
  • 那么,该类与 PACKETSIZE 有什么关系?

标签: c++ visual-studio networking udp


【解决方案1】:

您似乎正在发送一个结构,或者至少是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 的声明,上面可能会或可能不会做你需要做的事情。

【讨论】:

  • 非常感谢,我认为我在用指针做一些愚蠢的事情 =)
【解决方案2】:

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

解决方法很简单,用(char*)data 调用recvfrom,这样recvfrom 就会写入DataPacket,而不是超过DataPacket 指针。

【讨论】:

    【解决方案3】:

    在接收器中data 已经是一个指针,因此您使用& 地址操作符是一个错误(该表达式的结果是指针的地址)。

    只需将接收者调用更改为

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

    会解决问题的。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2016-01-09
        • 2023-04-04
        • 1970-01-01
        • 1970-01-01
        • 2012-02-13
        • 2015-06-11
        • 2017-06-17
        • 1970-01-01
        • 2020-04-01
        相关资源
        最近更新 更多