繁体   English   中英

UDP recvfrom()导致问题

[英]UDP recvfrom() causing issues

我一直在尝试从客户端接收数据包,但是在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“数据”就变成“无法评估表达式”

我真的很感谢任何帮助

谢谢

看来您正在发送结构,或者至少是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的声明,上面的内容可能会或可能不会执行您需要做的事情。

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

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

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

只需将接收方呼叫更改为

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

将解决问题。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM