#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».