UDP 数据报按 space 个字符拆分
UDP datagram is being split on space character
我正试图进入 SDLnet,我遇到了一个问题,我从客户端发送到服务器的任何 UDP 数据包都在 space 字符上被分解。我看不出发生这种情况的任何原因,因为我没有明确地对此行为进行编程 - 我实际上只是在发送一个字符串。
我使用的源代码是 online example on The Game Programming Wiki
的一部分
服务器
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;
}
输出
输出看起来像 this image。
我 运行 使用的操作系统是 Windows 7 64 位,我想知道这是否与 OS 相关。
这不是 UDP
的错,它与 char*
在使用 scanf
时被拆分有关。 (我不是 100% 确定这里的细节。)但作为一般规则,在 C 中,you shouldn't use 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();
是为了确保我们停下来等待用户输入消息。
我正试图进入 SDLnet,我遇到了一个问题,我从客户端发送到服务器的任何 UDP 数据包都在 space 字符上被分解。我看不出发生这种情况的任何原因,因为我没有明确地对此行为进行编程 - 我实际上只是在发送一个字符串。
我使用的源代码是 online example on The Game Programming Wiki
的一部分服务器
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;
}
输出
输出看起来像 this image。
我 运行 使用的操作系统是 Windows 7 64 位,我想知道这是否与 OS 相关。
这不是 UDP
的错,它与 char*
在使用 scanf
时被拆分有关。 (我不是 100% 确定这里的细节。)但作为一般规则,在 C 中,you shouldn't use 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();
是为了确保我们停下来等待用户输入消息。