Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Не доходят Icmp пакеты!

7.5K
19 января 2005 года
Caesarus
9 / / 29.10.2004
Делаю коммуникацию между клиентом и сервером по средствам ICMP протокола. При посылке пакетов клиентом локальной машине (сервер на ней запущен), то все проходит ок, пакеты доходят. А если я устанавливаю серверную часть на свой сервер и пытаюсь туда послать что -либо клиентом - то пакеты где-то теряются, хотя ошибок никаких не выдает sendto()!
Файер отключал.

Вот смотрите плз исходник клиента. При попытке послать ICMP пакет на любой ИП, кроме локального ничего не уходит. Посмотрите плз в чем ошибка.

P.S. source in pure c.

Код:
typedef struct s_icmp_hdr // ICMP header=packet
{
    BYTE i_type;
    BYTE i_code; /* type sub code */
    unsigned short i_cksum;
    //4 bytes till here
    unsigned short i_id;
    unsigned short i_seq;
    //6 bytes till here

    /* My Communictaion icmp data */
    unsigned char cPass[7];
    unsigned char cCommand;
    unsigned int iTarget;   //4 bytes!?
    unsigned int iTFsize;
    unsigned char cCFName[40];
    //should be 64 bytes(linux)
}
IcmpHdr;


void fill_icmp_header(IcmpHdr *icmp_hdr, int datasize, BYTE IcmpType){
    icmp_hdr->i_type = IcmpType;//ICMP_ECHO; //hm..... :(
    icmp_hdr->i_code = 0;
    icmp_hdr->i_cksum = 0;  //complete icmphdr + icmpdata
    icmp_hdr->i_id = (rand() % 240) + 1;
    icmp_hdr->i_seq = 0;
}

USHORT checksum(USHORT *buffer, int size){

    unsigned long cksum=0;

    while(size >1)  {
            cksum+=*buffer++;
            size -=sizeof(USHORT);
        }

    if(size )   {
            cksum += *(UCHAR*)buffer;
        }

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

    return (USHORT)(~cksum);
}

....................................................................

DWORD WINAPI FlashThread(LPVOID params){
    SOCKET serv_sock;
    SOCKADDR_IN rem_sin;
    int rem_sin_size = sizeof(rem_sin);
    int iSize, timeout = 1000;
    char icmp_packet[1024];
    char ss[255];
    int datasize;

    while (1){
        serv_sock = WSASocket (AF_INET, SOCK_RAW, IPPROTO_ICMP, NULL, 0,0);
        if (serv_sock == INVALID_SOCKET)            {
            //  MessageBox(NULL, "socket() failed", "Error", MB_OK);
            continue;
        }

        iSize = setsockopt(serv_sock,SOL_SOCKET,SO_SNDTIMEO,(char*)&timeout, sizeof(timeout));

        rem_sin.sin_family = AF_INET;
        rem_sin.sin_port = htons((u_short)SERVER_PORT);
        rem_sin.sin_addr.s_addr = inet_addr(SERVER_ADDR);

        datasize = sizeof(IcmpHdr);                 //Checksum //LAST//
        fill_icmp_header((IcmpHdr*)icmp_packet, datasize, 0);
        ((IcmpHdr*)icmp_packet)->cCommand = 'p'; // ping
        ((IcmpHdr*)icmp_packet)->i_cksum = checksum((USHORT*)icmp_packet, datasize);

        iSize = sendto(serv_sock, icmp_packet, datasize, 0, (struct sockaddr*)&rem_sin, sizeof(rem_sin));
        if (iSize == SOCKET_ERROR)
        {
            if (WSAGetLastError() == WSAETIMEDOUT)
            {
                //  MessageBox(NULL, "WSAETIMEDOUT", "Error", MB_OK);
                closesocket(serv_sock);
                Sleep(60 * 1000);
                continue;
            }

            //  MessageBox(NULL, "sendto()", "Error", MB_OK);
            closesocket(serv_sock);
            Sleep(60 * 1000);
            continue;
        }
        Sleep(10 * 60 * 1000); // 10 mins delay
    }

    closesocket(serv_sock);
    return 0;
}
1.9K
20 января 2005 года
HEvgA
49 / / 16.09.2004
Цитата:
Originally posted by Caesarus
Делаю коммуникацию между клиентом и сервером по средствам ICMP протокола. При посылке пакетов клиентом локальной машине (сервер на ней запущен), то все проходит ок, пакеты доходят. А если я устанавливаю серверную часть на свой сервер и пытаюсь туда послать что -либо клиентом - то пакеты где-то теряются, хотя ошибок никаких не выдает sendto()!
Файер отключал.

Вот смотрите плз исходник клиента. При попытке послать ICMP пакет на любой ИП, кроме локального ничего не уходит. Посмотрите плз в чем ошибка.



Дарова, чета не совсем понятен твой вопрос, или до меня туго доходит или он на самом деле такой замудренный. Объясни "схемотично", есть комп A и B, на А стоит серверная часть на В клиент, если ...

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог