Я пытаюсь проникнуть в 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, и мне интересно, может ли это быть что-то, связанное с ОС.
Это не вина 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();
чтобы убедиться, что мы остановимся и подождем, пока пользователь введет сообщение.