【问题标题】:Char array prints random garbage in UDP clientChar 数组在 UDP 客户端打印随机垃圾
【发布时间】:2016-04-28 22:12:08
【问题描述】:

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

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

一个例子是:

N4www.google.com

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

第二个字节告诉服务器是发送 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);
        }

【问题讨论】:

  • 我将在问题注释中添加强制性的复制粘贴您的代码
  • 将相关代码粘贴到您的问题中会更有用。另请参阅minimal reproducible example。
  • @e0k 啊哈,差点搞定
  • 添加了给我带来麻烦的代码
  • 空终止符??我没有查看代码/数据,但通常情况下是这样的。

标签: c sockets networking udp


【解决方案1】:

您看到的输出类似于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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-28
    • 1970-01-01
    • 1970-01-01
    • 2019-11-26
    • 2022-01-03
    • 1970-01-01
    • 2020-04-20
    相关资源
    最近更新 更多