首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Recvfrom和Wireshark

Recvfrom和Wireshark
EN

Stack Overflow用户
提问于 2019-04-26 21:48:00
回答 1查看 333关注 0票数 1

我与服务器通信,我用套接字(sock_raw.)发送消息,它工作正常,客户机( me ),发送消息,服务器接收正确的消息,但是当服务器需要将它发送给我(客户机)时,客户端不会从recv中检索正确的信息。

我在两个调用服务器->client上检索这个信息:

代码语言:javascript
复制
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 ):

代码语言:javascript
复制
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消息发送的输出:

下面是在同一个函数上发送和重新编码的代码:

代码语言:javascript
复制
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);
    }
EN

回答 1

Stack Overflow用户

发布于 2019-04-26 22:26:28

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

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

代码语言:javascript
复制
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");
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55875300

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档