我正在创建一个简单的UDP服务器/客户端,代码应该执行以下操作:
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);
}
答案 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