gpt4 book ai didi

c - Recvfrom 和 Wireshark

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

我与服务器通信,我使用套接字 (sock_raw..) 发送消息,它工作正常,客户端(我)发送消息,服务器接收到正确的消息,但是当服务器需要发送时对我(客户)来说,客户没有从 recv 中检索到正确的信息。

我在两次调用 server->client 时检索到它:

buffer = [E] | len_buffer = [2]
buffer = [E] | len_buffer = [2]

但是我的缓冲区需要等于这个数据并且有这个大小:

第一次调用(10 字节十六进制数据) enter image description here

第二次调用(2 字节十六进制数据) enter image description here

这就是我使用 recvfrom 函数的方式(t->sock 是服务器的套接字 fd,t->msg_recv 是为从服务器接收消息而创建的缓冲区,t->_recv 是 sockaddr* 结构接收):

if (recvfrom(t->sock, t->msg_recv, sizeof(t->msg_recv), 0, \
(struct sockaddr *)&t->_recv, \
(socklen_t[1]){sizeof(struct sockaddr_in)}) < 0) {
perror("recvto()");
exit(84);
}

这里的 Barmar 是 Wireshark 消息发送的输出:

enter image description here

下面是同一个函数的 send 和 recvfrom 代码:​​

int len = 0;
if (sendto(t->sock, t->buffer, t->ip->tot_len, 0,
(struct sockaddr *)&t->_sin, sizeof(t->_sin)) < 0) {
perror("sendto()");
exit(84);
}
if ((len = recvfrom(t->sock, t->msg_recv, sizeof(t->msg_recv), 0, \
(struct sockaddr *)&t->_recv, \
(socklen_t[1]){sizeof(struct sockaddr_in)})) < 0) {
perror("recvto()");
exit(84);
}

最佳答案

缓冲区不是字符串,它是二进制数据,所以你不应该用 %s 打印它。

调用recvfrom时需要获取缓冲区的长度。然后使用循环以 %02X 格式打印每个字节。

len = recvfrom(t->sock, t->msg_recv, sizeof(t->msg_recv), 0, \
(struct sockaddr *)&t->_recv, \
(socklen_t[1]){sizeof(struct sockaddr_in)});
if (len < 0) {
perror("recvto()");
exit(84);
}
for (int i = 0; i < len; i ++) {
printf("%02X ", t->msg_recv[i]);
if (i % 16 == 15) {
printf("\n");
} else if (i % 16 == 7) {
printf(" ");
}
}
printf("\n");

关于c - Recvfrom 和 Wireshark,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55875300/

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