ICMP数据包未与C中的原始套接字一起发送

时间:2018-06-07 01:17:37

标签: c ip raw-sockets

我有一个程序尝试使用原始套接字在C中发送ICMP数据包。但是,每次发送ICMP数据包时,都会收到来自$(document).ready(function() { var textarea = $("#my_textarea"); textarea.keydown(function(event) { var numbOfchars = textarea.val(); var len = Math.min(numbOfchars.length, 10); $(".chars-counter").text(len); }); }); 的错误,sendto

这是主要部分:

Invalid argument.

这是发生错误的函数:

int main(int argc, char *argv[])
{
    if (argc != 3)
     {
            fprintf(stderr, "Usage: ./main [src] [dst]\n");
            return -1;
     }

    struct sockaddr_in src, dst;
    memset(&src, 0, sizeof(struct sockaddr_in));
    memset(&dst, 0, sizeof(struct sockaddr_in));

    inet_pton(AF_INET, argv[1], &src.sin_addr);
    inet_pton(AF_INET, argv[2], &dst.sin_addr);

    int s = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);
    if (s == -1)
     {
            perror("socket");
            return -1;
     }


    void *pkt = create_pkt(&src, &dst, IPPROTO_ICMP);
    if (!pkt)
     {
            close(s);
            return -1;
     }

    send_pkt(s, pkt, sizeof(ICMP) + sizeof(IP), &dst);
    return 0;
}

我知道我的系统上启用了原始套接字(我正在使用Ubuntu 16.04),我还尝试了void send_pkt(int s, void *pkt, int size, struct sockaddr_in *dst) { if (sendto(s, pkt, size, 0, (struct sockaddr *) dst, sizeof(struct sockaddr)) == -1) { perror("sendto"); return; } } 中包含IP目标地址的值,但没有任何结果发生重大变化。结果,我离开了dstdst->sin_port = 0

如果有人能说清楚为什么这不起作用,我将不胜感激。

1 个答案:

答案 0 :(得分:1)

使用原始套接字,如果IP头中的任何字段不正确,sendto将返回错误。在我的情况下,我切换了IHL和版本的定位(由于端点问题,我将它们组合成一个字段)。因此,故事的道德:如果您收到原始套接字的sendto: Invalid argument错误,请务必检查IP标头,而不仅仅是sendto的目标结构。