SDL_net UDP пакет данных

Я новичок в сетевом программировании. Я немного поработал с TCP-сокетами и пытаюсь использовать простой UDP-клиент (ы) / сервер.

Я использую инфраструктуру SDL_net для этого проекта.

Проблема, с которой я сталкиваюсь, заключается в использовании структуры UDPpacket. Uint8 * в качестве типа данных для данных. Однако я просто хочу иметь возможность отправлять прямо текстовые сообщения. Я немного читал о кастинге, но ничего не похоже на совместимость, и я изо всех сил пытаюсь найти правильное решение для этого.

Код для клиента показан ниже. Ошибка, как вы могли бы предположить, заключается в том, что я пытаюсь установить p-данные (в нижней части кода).

Любые ваши советы или исправления будут с благодарностью!

#include <iostream>
#include <stdio.h>
#include <SDL2/SDL.h>
#include <SDL2_net/SDL_net.h>

using namespace std;int main(int argc, const char * argv[]) {

UDPsocket sd;

//create the socket
if(!(sd = SDLNet_UDP_Open(0))) {
printf("Could not create socket\n");
SDLNet_Quit();
SDL_Quit();
exit(1);
}

//get my address
IPaddress* myaddress = SDLNet_UDP_GetPeerAddress(sd, -1);
if(!myaddress) {
printf("Could not get own port\n");
exit(2);
}

cout << "My Port: " << myaddress->port << endl;/******************************
* These are used to recieve
*******************************/

UDPpacket * rcvP = SDLNet_AllocPacket(1024);
if(!rcvP) {
printf("Could not allocate receiving packet\n");
exit(3);
}

UDPsocket rcvS;
rcvS = SDLNet_UDP_Open(myaddress->port);
if(!rcvS)
{
printf("Could not allocate receiving socket\n");
exit(4);
}

//resolve the address of the server
IPaddress srvHost;
IPaddress * ip = & srvHost;
SDLNet_ResolveHost(ip, "localhost", 8888);

//set up the packet
UDPpacket * p = SDLNet_AllocPacket(1024);
if(!p) {
printf("Could not allocate packet\n");
SDLNet_Quit();
SDL_Quit();
exit(2);
}

//link the server address to our packet
p->address.host = srvHost.host;
p->address.port = srvHost.port;//main loop
while(true){

SDL_Event e;
while(SDL_PollEvent(&e))
{
if(e.type == SDL_KEYDOWN)
{
char * data;
switch(e.key.keysym.sym)
{
case SDLK_LEFT:
p->data = "left";
p->len  = strlen("left") + 1;
SDLNet_UDP_Send(sd, -1, p);
break;
case SDLK_RIGHT:
p->data = "right";
p->len  = strlen("right") + 1;
SDLNet_UDP_Send(sd, -1, p);
break;
default:
break;
}
}
}

}

return 0;
}

3

Решение

p->data указывает на буфер, который уже был выделен SDLNet_AllocPacket — вам нужно скопировать ваши строковые данные в него, а не пытаться заменить, куда он указывает. Итак, вы захотите делать что-то похожее на это всякий раз, когда вы обновляете пакет с данными строки C:

{
static const char* data = "left";
p->len = strlen(data) + 1;
memcpy(p->data, data, p->len);
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]