我正在制作一个简单的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 odgovorn");
/* 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("%sn", 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