UDP recvfrom () вызывает проблемы - PullRequest
0 голосов
/ 11 ноября 2011

Я пытался получить пакет данных от клиента, однако во время процесса 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 () поместил данные в «data», dataPacket «data» становится «выражение не может быть оценено»

Я был бы очень признателен за любую помощь

Спасибо

Ответы [ 4 ]

0 голосов
/ 11 ноября 2011

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

0 голосов
/ 11 ноября 2011

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

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

0 голосов
/ 11 ноября 2011

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

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

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

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

0 голосов
/ 11 ноября 2011

Кажется, вы отправляете структуру или, по крайней мере, необработанные данные в 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, приведенное выше может или не может сделать то, что вам нужно.

...