c - 使用原始套接字从 recvfrom 获取数据

标签 c linux sockets raw-sockets

我正在尝试实现我自己的传输层协议(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/

相关文章:

c - 在 C 中读写文件没有给出正确的输出

iphone - 如何从 NSArray 中选择一个对象?

代码优化

python - 运行 django 本地服务器而不是在 shell 别名中打开 chrome 页面

linux - 如何区分带后缀和不带后缀的文件名?

c++ - 无符号和有符号类型的相等操作数行为

linux - 仅当其 ASCII 格式文件时,shell one-liner 才能对文件进行分类

perl - 驼鹿对象中Socket属性的奇怪行为

python - 使用 Flask-SocketIO 自定义握手数据

linux - LDAP 监听本地主机但主机名或 IP