- Compiler: Code :: Blocks (GNU GCC)
- Platforma: Windows (x86)
- Zawiera: winsock.h winsock2.h (ws2_32 jest związana również)
Obecnie próbuję napisać program, który odczyta plik tekstowy zawierający listę adresów IP i pinguje każdy adres IP, odpowiednio. Jeśli host odpowie na polecenie ping, adres IP hosta zostanie skopiowany do drugiego pliku określonego przez użytkownika. Niestety, po raz pierwszy użyłem biblioteki gniazd C i nie mogę znaleźć dobrego tutoriala o tym, jak pingować przy użyciu C. Z tego, co rozumiem w tutorialach dla par, znalazłem. Muszę dołączyć nagłówek ICMP, który jest strukturą zawierającą typ ICMP, kod i sumę kontrolną w datagramie IP. Ale nie mam pojęcia, jak to zrobić, czy powinienem zadeklarować samą strukturę, czy jest ona zadeklarowana w pliku nagłówkowym? Zakładam, że jest w nagłówku, ale samouczki przeczyły sobie nawzajem dokładnie, gdzie jest zadeklarowane. Byłem zmęczony, włączając w to icmp.h i netinet/icmp.h, ale mój kompilator narzekał, że nie istnieją, więc stworzyłem własną strukturę.Jak Ping Korzystanie Sockets Library - C
struct echo_request
{
char type; // Type
char code; // Code
short checksum; // Checksum
short id; // Identification
short seq; // Sequence
int time; // Time
char data[16]; // Data
};
Myślałem, że mogę być w stanie uciec z nim, ale nie byłem nawet w stanie skompilować mój program, bo mój kompilator mówi, że in_cksum() (generator suma kontrolna) jest niezdefiniowane.
Podsumowując moje pytania, jakie pliki nagłówkowe należy dołączyć, jak utworzyć pakiet ping, czy używam poprawnej funkcji generatora sum kontrolnych, czy ping powinien być przekierowany do portu 80, a gniazdo, którego używam, powinno być RAW lub DGRAM?
To, co do tej pory miałem, proszę zauważyć, że celowo pominąłem sprawdzanie błędów.
int socket_descriptor = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
struct sockaddr_in address; //Initialize address struct
memset(&address, 0, sizeof(address)); //Clear address struct
//Declare address
address.sin_family = AF_INET;
address.sin_addr.s_addr = inet_addr(ipaddress);
address.sin_port = htons(80);
//Bind socket to address
bind(socket_descriptor, (struct sockaddr *)&address, sizeof(address));
//Create packet
struct echo_request packet; //See above for declaration of struct
memset(packet.data, 1, 16);
packet.type = 8; //ECHO_REQUEST
packet.code = 0;
packet.time = gettime();
packet.checksum = 0;
packet.checksum = in_cksum(packet, sizeof(packet));
1) struktura musi być spakowana, upewnij się, że kompilator nie wyrównuje pól 2) Czy system Windows obsługuje dobrze gniazda źródłowe (tego nie wiem)? –