recvfrom with Raw Sockets,只获取数据

时间:2014-11-12 21:29:47

标签: c linux sockets raw-sockets

我正在尝试实现自己的传输层协议,但我非常高兴离开网络层,而不需要弄乱实际的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;
}

2 个答案:

答案 0 :(得分:2)

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

raw(7)

  

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

参考:

答案 1 :(得分:1)

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