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

时间:2016-04-28 22:12:08

标签: c sockets networking 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 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);
        }

1 个答案:

答案 0 :(得分:0)

您看到的输出与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