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(); 是为了确保我们停下来等待用户输入消息。