【问题标题】:recvfrom with Raw Sockets, get just the datarecvfrom 使用原始套接字,只获取数据
【发布时间】:2015-01-09 21:27:02
【问题描述】:

我正在尝试实现我自己的传输层协议,但我很高兴让网络层保持原样,并且不需要弄乱实际的 IP 标头信息。

当然,当在原始套接字上调用 recvfrom() 时,会得到原始 IP 数据报,而 sockaddr 结构体没有填写。

有没有办法让堆栈填充这些结构并将 ip 标头留在数据部分之外,还是需要手动实现?

接收者:

struct sockaddr_in sender;
int sender_len;

raw_socket = socket(AF_INET, SOCK_RAW, 56);

...

if((n = recvfrom(raw_socket, buf, 1024, 0, (struct sockaddr*)&sender, &sender_len)) == -1){
    perror("recvfrom");
    return -1;
}

【问题讨论】:

  • 已更新以显示接收方代码。
  • 好吧,看来那是不可避免的了。不过感谢您的帮助。
  • 可以使用数据报而不是原始套接字,然后只能看到 buf 数组中的数据。

标签: c linux sockets raw-sockets


【解决方案1】:

使用 recvmsg() 并初始化 msg[] 缓冲区,以便第一个接收 IP 标头,然后第二个将只包含数据。

【讨论】:

    【解决方案2】:

    在 SOCK_RAW 套接字上接收时,将始终包含 IP 标头。

    raw(7):

    除非在套接字上启用了IP_HDRINCL 套接字选项,否则 IPv4 层会在发送数据包时生成 IP 标头。启用后,数据包必须包含 IP 标头。 用于接收的 IP 标头始终包含在数据包中。

    参考:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-20
      • 1970-01-01
      • 1970-01-01
      • 2013-05-14
      • 1970-01-01
      • 2013-08-20
      • 1970-01-01
      相关资源
      最近更新 更多