UDP датаграмма разделяется на пробел

Я пытаюсь проникнуть в SDLnet и столкнулся с проблемой, когда все UDP-пакеты, которые я отправляю с клиента на сервер, разбиваются на символ пробела. Я не вижу никакой причины для этого, так как я не программирую явно это поведение — я буквально просто пересылаю строку.

Исходный код, который я использую, является частью онлайн пример на Вики по программированию игр

сервер

    printf("Fill the buffer\n>");
scanf("%s", (char *)p->data);

p->address.host = srvadd.host;  /* Set the destination host */
p->address.port = srvadd.port;  /* And destination port */

p->len = strlen((char *)p->data) + 1;
SDLNet_UDP_Send(sd, -1, p); /* This sets the p->channel */

/* Quit if packet contains "quit" */
if (!strcmp((char *)p->data, "quit"))
quit = 1;

клиент

    /* Wait a packet. UDP_Recv returns != 0 if a packet is coming */
if (SDLNet_UDP_Recv(sd, p))
{
printf("UDP Packet incoming\n");
printf("\tChan:    %d\n", p->channel);
printf("\tData:    %s\n", (char *)p->data);
printf("\tLen:     %d\n", p->len);
printf("\tMaxlen:  %d\n", p->maxlen);
printf("\tStatus:  %d\n", p->status);
printf("\tAddress: %x %x\n", p->address.host, p->address.port);

/* Quit if packet contains "quit" */
if (strcmp((char *)p->data, "quit") == 0)
quit = 1;
}

Выход

Выход выглядит как это изображение.

Операционная система, на которой я работаю, — 64-разрядная Windows 7, и мне интересно, может ли это быть что-то, связанное с ОС.

0

Решение

Это не вина UDPПойду делать с char* разделяется при использовании scanf, (Я не уверен на 100% в деталях здесь.) Но, как правило, в Си, ты не должен использовать scanf

Так как вы используете C++ (по крайней мере, в соответствии с тегами), вы должны сделать это C++ путь :

std::string msg = "";
std::cout << "Type a message and hit enter\n";

// Let user type a message
std::cin.ignore();
std::getline(std::cin, msg );

// UDPpacket uses Uint8, whereas msg.c_str() gives us a char*
// This simply copies the integer value of the chars into packet->data
memcpy(packet->data, msg.c_str(), msg.length() );

packet->len = msg.length();

Замечания :
std::cin.ignore(); чтобы убедиться, что мы остановимся и подождем, пока пользователь введет сообщение.

2

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


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