万一我对recvfrom的调用返回了有效量的字节(例如1400),我在缓冲区的开头会得到什么?

我会收到ethhdr吗?即使我应该接收UDP数据包,该代码也无法正常工作:

void read_packets(struct config *cfg) {

    int64_t read_bytes = recvfrom(cfg->socket_fd, buffer, BUFFER_SIZE, 0, NULL, NULL);
    if(read_bytes == -1) {
        return;
    }

    cfg->stats.amnt_of_packets += 1;
    cfg->stats.amnt_of_bytes += read_bytes;

    struct ethhdr *eth = (struct ethhdr*)(buffer);
    if(ntohs(eth->h_proto) == ETH_P_IP) {
        struct iphdr *iph = (struct iphdr*)(buffer + sizeof(struct ethhdr));
        if(iph->protocol == IPPROTO_UDP) {
            /* doesn't work */
        }
    }
}
socket_fd创建为:
cfg->socket_fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);

最佳答案

在UDP套接字上使用recvfrom只会返回UDP数据包的有效负载,即发送端传递给sendto的内容。您不会在其中看到以太网 header ,IP header 或UDP header 。

但是,您确实为最后两个参数传递了NULL值。这些可用于填充struct sockaddr_in结构,该结构将包含发送方的IP地址和UDP端口。

另外,如果使用recvmsg,则可以从IP header 中获取某些字段的值,例如目标IP地址(如果套接字正在接收多播数据包,则很有用),TOS/DSCP字段或各种IP选项,可以设置。

关于c - Linux UDP recvfrom : What do I get at the start of my buffer?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60416580/

10-16 10:09