字符数组在 UDP 客户端打印随机垃圾

Char array prints random garbage in UDP client

我正在制作一个简单的 UDP server/client,代码应该执行以下操作:

UDPCLIENT循环从标准输入中读取一行并将数据发送给UDPSERVER。

这方面的一个例子是:

N4www.google.com

第一个字节告诉服务器是向客户端发送主机名的点分十进制值 (S) 还是十六进制值 (N)(在本例中为 www.google.com)。

第二个字节告诉服务器是发送 IPv4 还是 IPv6 地址。

如果我使用 S 作为第一个字节,一切都很好,客户端会打印主机名的点分十进制值。

但是,如果我使用 N 作为第一个字节,服务器会发送正确的值(在 wireshark 中检查),但客户端会以十六进制表示法在 IP 地址旁边打印一些随机 FF 值。

如果有人能查看 udpclient.c 文件并找出错误所在,我将不胜感激。

udpclient.c

udpserver.c

这是 udpclient.c 中给我带来麻烦的部分:

/* Recieve datagram from server */
if ((rcv_len = recvfrom( sockfd, rcv_buf, BUFF_SIZE, 0, 
                   (struct sockaddr *) &servaddr, &serv_len)) < 0)
            error("Problem s primanjem datagrama");

        /* If the value of first byte 0x00, print message */ 
        if (rcv_buf[0] == 0x00)
            printf("posluzitelj nije pronasao odgovor\n");

        /* If the value of first byte 0x01, print hex value from second byte */ 
        if (rcv_buf[0] == 0x01) {

            for (i=1; i<rcv_len - 1; i++) {

                printf("%X ", rcv_buf[i]);

            }

            printf("\n");

        }
        /* If the value of first byte 0x02, print dotted decimal value from second byte */ 
        if (rcv_buf[0] == 0x02) {

            memmove(rcv_buf, rcv_buf + 1, rcv_len - 1);
            printf("%s\n", rcv_buf);
        }

您看到的输出类似于 FFFFFFCC 4F FFFFFFC5 FFFFFFC8,因为在客户端的打印函数中,printf("%X ", rcv_buf[i]); %X 期望其输入为 unsigned int,而 rcv_buf[I]char,所以当整数提升发生时,符号位得到扩展。您可以做的是将输入转换为 unsigned 类型,以便在没有符号位的情况下完成提升。

for (i=1; i<rcv_len - 1; i++) {
    printf("%x ", (unsigned char)rcv_buf[i]);
}

现在它会打印成

CC 4F C5 C8