【发布时间】:2019-09-16 10:07:18
【问题描述】:
我与服务器通信,我使用套接字(sock_raw ..)发送消息,它工作正常,客户端(我)发送消息,服务器接收正确的消息,但是当服务器需要发送对我(客户)来说,客户没有从 recv 中检索正确的信息。
我在两次调用 server->client 时检索到这个:
buffer = [E] | len_buffer = [2]
buffer = [E] | len_buffer = [2]
但是我的缓冲区需要等于这个数据并且有这个大小:
这就是我使用 recvfrom 函数的方式(t->sock 是服务器的套接字 fd,t->msg_recv 是为从服务器接收 msg 而创建的缓冲区,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 消息发送的输出:
这里是 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);
}
【问题讨论】:
-
为什么行尾有反斜杠? C 不需要,除非在宏中。
-
你怎么知道客户没有收到正确的信息?
-
你在哪里设置
len_buffer? -
“我只收到一个大小为 2 的 E”是什么意思?
recvfrom()返回数据包的长度,但你不要在任何地方分配它。 -
您是否尝试将缓冲区打印为字符串?它不是字符串,而是二进制数据。
E是十六进制第一行末尾的45字节,后面是一个零字节。由于您使用的是原始套接字,因此您会在缓冲区中获得 IP 和 UDP 标头。
标签: c sockets wireshark recvfrom