UDP recvfrom() вызывает проблемы

#c #visual-studio #networking #udp

#c #visual-studio #сеть #udp

Вопрос:

Я пытался получить пакет данных от клиента, однако во время процесса recvfrom () я думаю, что я делаю что-то неправильно…

У меня есть то, что называется DataPacket, и это просто класс с некоторыми значениями x и y

Клиент выполняет следующее…

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

И сервер получает

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

Раньше это работало, когда я просто отправлял символы без обратного приведения, поэтому код действительно работал. Я думаю, что я делаю что-то не так с указателем, как только recvfrom () поместил данные в «data», пакет данных «data» становится «выражение не может быть оценено»

Я был бы действительно признателен за любую помощь

Спасибо

Комментарии:

1. DataPacket — это класс с int x, y; вот и все. Это работало до того, как было в классе, единственное отличие в том, что я передаю указатель, чтобы значение редактировалось.

2. Хорошо, как этот класс связан с размером ПАКЕТА ?

Ответ №1:

Кажется, вы отправляете структуру или, по крайней мере, необработанные данные в DataPacket . В этом случае измените код сервера на

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

Хотя вы должны показать объявление DataPacket и PACKETSIZE , вышеуказанное может делать или не делать то, что вам нужно.

Комментарии:

1. большое спасибо, я подумал, что делаю что-то глупое с указателем =)

Ответ №2:

Ваша Receive функция принимает указатель на пакет данных. Но при вызове recvfrom вы передаете (char*) amp;data , который является указателем на указатель. Это означает, что вы записываете пакетные данные поверх указателя, а не в него.

Исправление простое, вызовите recvfrom с (char*)data помощью, чтобы recvfrom выполнять запись в пакет данных, а не поверх указателя пакета данных.

Ответ №3:

В получателе data уже есть указатель, поэтому ваше использование amp; оператора address-of является ошибкой (результатом этого выражения будет адрес указателя).

Просто измените вызов получателя на

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

решит проблему.

Ответ №4:

В вашем вызове вы передаете адрес данных указателя в recvfrom, поэтому recvfrom выполняет запись в память, где хранятся данные переменной указателя. Вам нужно передать «(char *) data» вместо «(char *) amp;data».