当前位置: 首页 > 知识库问答 >
问题:

Recvfrom和Wireshark

姬振濂
2023-03-14

我与服务器通信,我用套接字(sock_raw)发送消息..),它的工作很好,客户端(我),发送消息,服务器收到正确的消息,但当服务器需要发送给我(客户端),客户端不检索正确的信息。

我在两个呼叫服务器上检索到这个-

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

但是我的缓冲区需要等于这个数据,大小如下:

这就是我使用 recvfrom 函数的方式 (t-

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消息发送的输出:

这是同一函数上的发送和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);
    }

共有1个答案

汪和悌
2023-03-14

缓冲区不是字符串,而是二进制数据,因此不应使用 %s 打印它。

当您从调用recv时,需要获取缓冲区的长度。然后使用循环以X格式打印每个字节。

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");

 类似资料:
  • recvfrom(经socket接收数据) 相关函数 recv,recvmsg,send,sendto,socket 表头文件 #include<sys/types.h> #include<sys/socket.h> 定义函数 int recvfrom(int s,void *buf,int len,unsigned int flags ,struct sockaddr *from ,int *f

  • recvfrom 经socket接收数据 相关函数 recv,recvmsg,send,sendto,socket 表头文件 #include<sys/types.h> #include<sys/socket.h> 定义函数 int recvfrom(int s, void *buf, int len, unsigned int flags, struct socka

  • 我知道从套接字中读取后立即返回。我的问题是- > 如果我请求了2000的buflen,而套接字队列中的单个数据包大小为2400,该怎么办? 如果我请求了2000的buflen,而套接字队列中的单个数据包大小为1400,该怎么办? 上述问题的答案是否适用于TCP和UDP?如果没有,有什么区别。 请提前回复。

  • 我正在编写udp服务器/客户端应用程序,其中服务器发送数据,客户端接收数据。当数据包丢失时,客户端应该向服务器发送nack。我将套接字设置为O_NONBLOCK,这样我就可以注意到客户端是否没有收到数据包 我的问题是,若服务器并没有开始发送数据包,那个么客户端的行为就是数据包丢失,并且开始向服务器发送nack。(没有可用数据时recvfrom失败)我需要一些建议,如果服务器没有开始发送数据包,如果

  • 对一个概念感到困惑... 假设客户端调用sendto()两次,每次向服务器发送100字节的数据报。那么如果服务器调用recvfrom(),接收缓冲区为200字节,它会将两个数据报接收到同一个缓冲区吗? 从我所了解到的……如果我发送到(100),那么我将在相同的数据报传输“空间”上接收来自(100)的recv 但是由于它是发送 100 的两次..那么 recvfrom(200) 会在不同的缓冲区上吗

  • 在我看来,我的缓冲区包含关于最后一个数据包步骤(路由器->my home)的信息,这些信息解释了为什么TTL值是254以及为什么我用Traceroute找到了相同的两个IP: $>traceroute qwant.com traceroute to qwant.com(194.187.168.99),30跳最大,60字节数据包 172.17.0.1(172.17.0.1)0.026 ms 0.01