我与服务器通信,我用套接字(sock_raw.)发送消息,它工作正常,客户机( me ),发送消息,服务器接收正确的消息,但是当服务器需要将它发送给我(客户机)时,客户端不会从recv中检索正确的信息。
我在两个调用服务器->client上检索这个信息:
buffer = [E] | len_buffer = [2]
buffer = [E] | len_buffer = [2]但是,我的缓冲区需要与这些数据相等,并且具有这样的大小:
第一次调用(数据为十六进制,10字节)

和第二次调用(数据以十六进制为单位,2字节)

以下是我如何使用recvfrom函数(t->sock是服务器的套接字fd,t-> msg _recv是为接收来自servern的msg而创建的缓冲区,t->_recv是接收端的sockaddr* struct ):
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消息发送的输出:

下面是在同一个函数上发送和重新编码的代码:
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);
}发布于 2019-04-26 22:26:28
缓冲区不是字符串,它是二进制数据,所以不应该用%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");https://stackoverflow.com/questions/55875300
复制相似问题