2013-12-16 73 views
2

我試圖用原始套接字發送udp數據包。對於IPv4,一切正常,但我無法突破IPv6套接字的問題,其中sendto()始終表示無效參數。最初我在考慮IPv6的強制校驗和,但IPV6_CHECKSUM選項應該解決這個問題,所以我現在沒有選擇。sendto()「無效參數」錯誤在Linux上的原始udp套接字

我使用inaddr_any作爲addr_from,並且使用addr_to的一些ipv6地址與同一個端口。我通過send_ip工具來源查看,它手動計算校驗和併發送帶有原始/原始套接字的數據包,但我希望linux根據基於策略的路由規則自動形成具有必要源地址的IP數據包。

有沒有人有任何想法這個問題的根源是什麼?或者使用raw/ipproto_udp套接字的任何工作示例?

在此先感謝!

PS:請忽略所有線程的東西

發送代碼:

typedef struct thread_data { 
    char msg[BUFFER_LENGTH]; 
    struct sockaddr_in6 addr_to; 
    struct sockaddr_in6 addr_from; 
} thread_data; 

void create_packet(const thread_data* data, void** packet, size_t* size) { 
    size_t msg_len = strlen(data->msg), udp_len = sizeof(struct udphdr); 
    struct udphdr udp = {0}; 

    udp.source = data->addr_from.sin6_port; 
    udp.dest = data->addr_to.sin6_port; 
    udp.len = htons(udp_len + msg_len); 
    udp.check = 0; 

    *packet = malloc(udp_len + msg_len); 
    if(!(*packet)) { 
     ERROR("malloc failed"); 
    } 

    memcpy(*packet, &udp, sizeof(struct udphdr)); 
    memcpy((*packet) + udp_len, data->msg, msg_len); 

    *size = udp_len + msg_len; 
} 

void client_thread(void* args) { 

    thread_data* data = (thread_data*)args; 

    int sock = -1; 
    if ((sock = socket(AF_INET6, SOCK_RAW, IPPROTO_UDP)) < 0) { 
     ERROR("failed to create socket"); 
    } 

    int val = 2; //I tried to play with this value, but with no luck 
    if(setsockopt(sock, IPPROTO_IPV6, IPV6_CHECKSUM, &val, sizeof(val)) < 0) { 
     ERROR("setsockopt failed"); 
    } 
    ssize_t res = sendto(sock, packet, size, 0, (struct sockaddr*)&(data->addr_to), sizeof(data->addr_to)); 
    if (res < 0) { 
     ERROR("sendto failed"); 
    } 
} 
+0

你用什麼作爲你的IPv6地址'addr_from'和'addr_to'? –

+0

對於我在6addr_any和addr_to中使用的addr_from,我使用了一些可從主機訪問的有效IPv6地址。 addr_to和addr_from的端口號相同。 – Alex

+0

你使用什麼作爲你的IPv6地址'addr_to'? –

回答

0

你居然試圖發送到無效 IPv6地址。

3ffe::/16內的地址是舊的6bone幾年前停用的地址。這些地址現在被認爲是無效的,並且可能被現代操作系統,路由器等拒絕。

+0

我看到了,但是我可以通過tcp和udp使用這類地址與通常的或原始的/原始的IPv6套接字進行通信。我假設如果問題出在地址本身(例如操作系統拒絕它),問題將會持續,無視套接字的類型。我錯過了什麼嗎?更新:我試過3aaa而不是3ffe,這沒有幫助。 – Alex

+0

嘗試使用真實有效的IPv6地址。 –

相關問題