簡體   English   中英

Linux UDP recvfrom:我在緩沖區的開頭得到了什么?

[英]Linux UDP recvfrom: What do I get at the start of my buffer?

如果我對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 您不會看到以太網標頭、IP 標頭或 UDP 標頭作為其中的一部分。

但是,您確實為最后兩個參數傳遞了 NULL 值。 這些可用於填充struct sockaddr_in結構,該結構將包含發送方的 IP 地址和 UDP 端口。

此外,如果您使用recvmsg ,您可以從 IP 標頭中獲取某些字段的值,例如目標 IP 地址(如果套接字正在接收多播數據包,則很有用)、TOS/DSCP 字段或各種 IP 選項可以設置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM