【问题标题】:get data with recvfrom使用 recvfrom 获取数据
【发布时间】:2019-07-20 17:17:21
【问题描述】:

我想用recvfrom()从套接字中检索数据

recvfrom() 允许获取包含 IP 标头、TCP 标头和数据的缓冲区。

是否有直接指向数据的快速函数? 我们是否应该将数据转换为主机(网络到主机)才能读取数据?

我不想使用read(),因为read()不提供ip头和tcp头

我觉得应该是这样的:

recvfrom(sock, packet, sizeof(buf) - 1, 0, NULL, NULL);
iph = (struct iphdr*)packet;
iphlen = iph->ihl* 4;
tcph = (struct tcphdr*)(packet + iphlen);
tcphlen = tcph->doff * 4;

data = packet + iphlen + tcphlen;

但我不知道是否必须将数据转换为主机(网络到主机)?

【问题讨论】:

  • 答案需要一个例子。
  • char *data = buf + sizeof(ip_hdr) + sizeof(tcp_hdr)。无需转换数据。
  • @sergeyrar tcp 标头的大小是可变的。 ANd 可以从 TCP 标头的 HLEN 字段中检索到
  • recvfrom() 没有获得包含所有标头的缓冲区。只是数据。在 TCP 流中包含标头是没有意义的。

标签: c++ c networking


【解决方案1】:

假设使用了SOCK_RAW 套接字。

IP头长度位于IP头第一个字节的低4位,计算32位整数。
TCP 报头长度位于 TCP 报头第 13 字节的高 4 位,按 32 位整数计算。

根据/usr/include/netinet/ip.h/usr/include/netinet/tcp.hiph->ihltcph->doff 位字段已经考虑了字节顺序,并且由于它们的长度小于一个字节(4 位),因此它们不再受制于任何进一步的 hton/ntoh转换。

【讨论】:

    猜你喜欢
    • 2015-01-09
    • 2016-11-09
    • 2020-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-20
    相关资源
    最近更新 更多