c-Char数组在UDP客户端中打印随机垃圾



我正在制作一个简单的UDP服务器/客户端,代码应该执行以下操作:

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 odgovorn");
        /* 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("%sn", 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

最新更新