我正在尝试实现自己的传输层协议,但我非常高兴离开网络层,而不需要弄乱实际的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;
}
答案 0 :(得分:2)
在SOCK_RAW套接字上接收时,将始终包含IP标头。
每raw(7)
:
除非在套接字上启用
IP_HDRINCL
套接字选项,否则IPv4层在发送数据包时会生成IP标头。启用后,数据包必须包含IP标头。 接收IP标头始终包含在数据包中。
参考:
答案 1 :(得分:1)
使用recvmsg()
初始化msg[]
个缓冲区,以便第一个接收IP标头,然后第二个只包含数据。