我正在尝试实现我自己的传输层协议(protocol),但我非常乐意让网络层保持原样并且不需要弄乱实际的 IP header 信息。
当然,当在原始套接字上调用 recvfrom() 时,您将获得原始 IP 数据报,而 sockaddr 结构未填充。
有没有办法让堆栈填充这些结构并将 ip header 留在数据部分之外,还是需要手动实现?
接收者:
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;
}
最佳答案
在 SOCK_RAW 套接字上接收时将始终包含 IP header 。
根据 raw(7)
:
The IPv4 layer generates an IP header when sending a packet unless the
IP_HDRINCL
socket option is enabled on the socket. When it is enabled, the packet must contain an IP header. For receiving the IP header is always included in the packet.
引用:
关于c - 使用原始套接字从 recvfrom 获取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26896944/