Модераторы: feodorv
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> пинг, icmp пакет 
:(
    Опции темы
n1ke
Дата 3.12.2006, 22:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 3.12.2006

Репутация: нет
Всего: нет



(Заранее извеняюсь за мой русский, эсли будут ошибки)

Всем привет!
У меня такая задача:
Надо послать ICMP пакет (echo), получить отклик (reply) и вывести его на екран! Всё ето надо написать под Linux (gcc).
Подскажите где я ошибся!

Код

#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/ip.h>
#include <netinet/ip_icmp.h>
#include <resolv.h>
#include <unistd.h>    /* For getpid() */

#define MAX_PACKET 1024


int main (int argc, char *argv[])
{
    if (argc != 2){
        printf ("usage: ping <IP>\n");
        return ;
    }
    
    char datagram[1024];
    char recvbuf[1024];
    int sequence = 0;
    int s = socket (PF_INET, SOCK_RAW, IPPROTO_ICMP);
    
    struct icmphdr *icmph = (struct icmphdr *) datagram;
    struct sockaddr_in sin;
    struct sockaddr_in from;
    

    sin.sin_family = AF_INET;
    sin.sin_addr.s_addr = inet_addr (argv[1]);

    memset (datagram + sizeof(struct iphdr), 0, MAX_PACKET - sizeof(struct iphdr));
    icmph->type = ICMP_ECHO;
    icmph->code = 0;
    icmph->checksum = 0;
    icmph->un.echo.id = getpid();   
    icmph->un.echo.sequence = sequence;
  
    if (sendto (s, datagram, MAX_PACKET, 0, &sin, sizeof(sin)) < 0)
        printf ("error\n");
    recvfrom (s, recvbuf, sizeof(recvbuf), 0, (struct sockaddr_in *) &from, sizeof(from));
    printf ("%s\n",recvbuf);
    return 0;
}





Это сообщение отредактировал(а) n1ke - 3.12.2006, 22:23
PM   Вверх
Step
Дата 3.12.2006, 22:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5151
Регистрация: 26.9.2002
Где: дурдом.UA

Репутация: нет
Всего: 25



n1ke, а что собственно не так, ошибка при компиляции или чтото не так в алгоритме


--------------------
- Дурак учится на своих ошибках, умный на чужих.
 - умные учатся у дураков
PM MAIL ICQ   Вверх
n1ke
Дата 4.12.2006, 00:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 3.12.2006

Репутация: нет
Всего: нет



Я поменял одну строку в конце:

Код

printf ("Reply from %s\n", inet_ntoa (from.sin_addr.s_addr));


Программа не хочет присылать "reply", зато когда я запускаю прогу с адресом 127.0.0.1 она показывает "reply" c адреса 22.10.102.69 !!!

Что ето за чудо??
PM   Вверх
Dude03
Дата 4.12.2006, 00:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 28.4.2006

Репутация: нет
Всего: 6



Цитата(n1ke @  3.12.2006,  22:20 Найти цитируемый пост)
icmph->checksum = 0;

в винде такой бы пакет не отослался - чексума проверяется при отсылке smile  
PM MAIL   Вверх
n1ke
Дата 4.12.2006, 01:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 3.12.2006

Репутация: нет
Всего: нет



Никак не могу разобратся с чексуммой, может кто-нибуть обеснит по детски как она вычисляется (и с примером, если можно)
PM   Вверх
ptr
Дата 4.12.2006, 09:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 661
Регистрация: 31.5.2006
Где: Новосибирск

Репутация: 9
Всего: 14



Посмотри здесь. Там правда для Windows.


--------------------
Единственный способ определить границы возможного - это выйти за эти границы, в невозможное.
Артур Кларк.
PM MAIL ICQ   Вверх
Dude03
Дата 4.12.2006, 09:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 28.4.2006

Репутация: нет
Всего: 6



Цитата(ptr @  4.12.2006,  09:06 Найти цитируемый пост)
Посмотри здесь. Там правда для Windows. 

Ты же можешь пропинговать с винды никс? Почему тогда должна быть разница в вычислении crc
PM MAIL   Вверх
ptr
Дата 4.12.2006, 09:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 661
Регистрация: 31.5.2006
Где: Новосибирск

Репутация: 9
Всего: 14



Цитата(Dude03 @  4.12.2006,  12:24 Найти цитируемый пост)
Ты же можешь пропинговать с винды никс? Почему тогда должна быть разница в вычислении crc

А причём здесь я?



--------------------
Единственный способ определить границы возможного - это выйти за эти границы, в невозможное.
Артур Кларк.
PM MAIL ICQ   Вверх
Dude03
Дата 4.12.2006, 09:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 28.4.2006

Репутация: нет
Всего: 6



Цитата(ptr @  4.12.2006,  09:29 Найти цитируемый пост)
А причём здесь я?

 smile 
PM MAIL   Вверх
n1ke
Дата 4.12.2006, 23:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 3.12.2006

Репутация: нет
Всего: нет



Ребята, ну не получается у меня отослать пакет! Проблема заключается в чексумме. Я дописал функцию (нашел в инете) и всёравно никак!
Подскжте где я ошибся плзз !!!

Код

#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/ip.h>
#include <netinet/ip_icmp.h>
#include <resolv.h>
#include <unistd.h>    /* For getpid() */

#define ICMPHDR_SIZE 8
#define MAX_PACKET 64

unsigned short cksum(unsigned short *buf, int nbytes)
{
    unsigned int sum;
    unsigned short oddbyte;

    sum = 0;
    while (nbytes > 1) {
        sum += *buf++;
        nbytes -= 2;
    }

    if (nbytes == 1) {
        oddbyte = 0;
        *((unsigned short *) &oddbyte) = *(unsigned short *) buf;
        sum += oddbyte;
    }

    sum = (sum >> 16) + (sum & 0xffff);
    sum += (sum >> 16);



    return (unsigned short) ~sum;
}


int main (int argc, char *argv[])
{
    if (argc != 2){
        printf ("usage: ping <IP>\n");
        return ;
    }
    
    
    char
        datagram[MAX_PACKET],
        recvbuf[1024];
    
    int
        sequence = 0,
        s = socket (PF_INET, SOCK_RAW, IPPROTO_ICMP),
        datalen = MAX_PACKET - sizeof(struct icmphdr);
    
    struct icmphdr *icmph = (struct icmphdr *)datagram;
    struct sockaddr_in sin;
    struct sockaddr_in from;
    
    bzero (&sin, sizeof(sin));
    sin.sin_family = AF_INET;
    sin.sin_addr.s_addr = inet_addr (argv[1]);
    
    memset (datagram, 0, MAX_PACKET);
    icmph->type = ICMP_ECHO;
    icmph->code = 0;
    icmph->checksum = cksum ((unsigned short *)datagram, MAX_PACKET);
    icmph->un.echo.id = getpid();
    icmph->un.echo.sequence = sequence;
  
    if (sendto (s, datagram, MAX_PACKET, 0, &sin, sizeof(sin)) < 0)
        printf ("error\n");
    recvfrom (s, recvbuf, sizeof(recvbuf), 0, (struct sockaddr_in *) &from, sizeof(from));
    printf ("Reply from %s\n", inet_ntoa (from.sin_addr.s_addr));
    return 0;

}



PM   Вверх
Dude03
Дата 5.12.2006, 00:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 28.4.2006

Репутация: нет
Всего: 6



 smile 
сначала заполняются все поля и чексумма в 0, а потом уже высчитывается чексумма пакета smile 
PM MAIL   Вверх
bel_nikita
Дата 5.12.2006, 00:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 1
Всего: 47



для начала: 
Код

...
struct icmphdr icmph;
...
icmph.checksum = 0;
icmph.type = ICMP_ECHO;
icmph.code = 0;
icmph.un.echo.id = getpid();
icmph.un.echo.sequence = sequence;
icmph.checksum = cksum ( (unsigned short *)&icmph, sizeof(icmph) );
...
if (sendto (s, (char*)&icmph, sizeof(icmph), 0, &sin, sizeof(sin)) < 0) printf ("error\n");
...



--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
n1ke
Дата 5.12.2006, 00:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 3.12.2006

Репутация: нет
Всего: нет



Большое спасибо!
PM   Вверх
Virun
Дата 23.12.2006, 22:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 1.9.2005

Репутация: нет
Всего: нет



А можно узнать для чего введена коннстанта ICMPHDR_SIZE? Она ведь нигде не ипользуется =\
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0557 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.