【发布时间】: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 中给我带来麻烦的部分:
/* 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