Отправьте пакет UDP и получите ответ ICMP от маршрутизатора в C - PullRequest
4 голосов
/ 03 февраля 2011

Я пытаюсь написать программу на C, которая отправляет UDP-пакет на указанный IP-адрес и ожидает ICMP-ответа маршрутизатора, сообщающего, что время жизни истекло. Все очень просто, потому что сначала я хочу понять механизм. Что мне нужно, так это кто-то проверяет мой код и дает обратную связь о том, что не так, а что нет. Я очень неопытный в C-программировании, но я должен сделать это как задание - изо всех сил, чтобы понять это ...

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <netinet/ip.h> 

// The packet length
#define PCKT_LEN 8192 

// Source IP, source port, target IP, target port from the command line arguments
int main(int argc, char *argv[])
{
    int send, recv, resp;
    int ttl = 1; // Time to live
    char buffer[PCKT_LEN];

    // Destination address
    struct sockaddr_in dst;

    // ICMP Response
    struct msghdr icmp;

    memset(buffer, 0, PCKT_LEN);

    // Create a raw socket with UDP protocol
    if ((send = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0)
    {
        printf("Could not process socket() [send].\n");
        return EXIT_FAILURE;
    }

    // ICMP Socket
    if ((recv = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP)) < 0)
    {
        printf("Could not process socket() [recv].\n");
        return EXIT_FAILURE;
    }

    dst.sin_family      = AF_INET;
    dst.sin_addr.s_addr = inet_addr("74.125.39.106");
    dst.sin_port        = htons(60001);

    // Define time to life
    if(setsockopt(send, IPPROTO_IP, IP_TTL, &ttl, sizeof(ttl)) < 0)
    {
        printf("Could not process setsockopt().\n");
        return EXIT_FAILURE;
    }

    if(sendto(send, buffer, sizeof(buffer), 0, (struct sockaddr *) &dst, sizeof(dst)) < 0)
    {
        printf("Could not process sendto().\n");
        return EXIT_FAILURE;
    }


    if((resp = recvmsg(recv, (struct msghdr *) &icmp, IP_RECVERR|MSG_ERRQUEUE)) < 0 )
    {
        printf("Could not process recvmsg().\n");
        return EXIT_FAILURE;
    }

    close(send);
    close(recv);

    return 0;
}

Я получаю сообщение "Не удалось обработать recvmsg ()". и я понятия не имею, что еще попробовать. Я хочу получить ICMP-ответ и прочитать IP-адрес отправителя.

Ждем полезных советов.

С наилучшими пожеланиями!

1 Ответ

6 голосов
/ 03 февраля 2011

Я обычно использую

recvfrom(serversock, buf, 100, 0, (struct sockaddr *)&rcv,&size);

printf("Received packet from %s:%d\nData: %s\n\n", inet_ntoa(rcv.sin_addr), ntohs(rcv.sin_port), buf);
...