gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 04:30:26 25 4
gpt4 key购买 nike

我正在制作一个简单的 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);
}

最佳答案

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

关于字符数组在 UDP 客户端打印随机垃圾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36926376/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com