字符数组在 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 中给我带来麻烦的部分:
/* 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 server/client,代码应该执行以下操作:
UDPCLIENT循环从标准输入中读取一行并将数据发送给UDPSERVER。
这方面的一个例子是:
N4www.google.com
第一个字节告诉服务器是向客户端发送主机名的点分十进制值 (S) 还是十六进制值 (N)(在本例中为 www.google.com)。
第二个字节告诉服务器是发送 IPv4 还是 IPv6 地址。
如果我使用 S 作为第一个字节,一切都很好,客户端会打印主机名的点分十进制值。
但是,如果我使用 N 作为第一个字节,服务器会发送正确的值(在 wireshark 中检查),但客户端会以十六进制表示法在 IP 地址旁边打印一些随机 FF 值。
如果有人能查看 udpclient.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