Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Сети > ICMP, Trace


Автор: metoflex 15.2.2011, 10:11
Здравствуйте!

Передо мной встала задача:

Написать свою утилиту trace, чисто используя IP-пакеты, формировать все ICMP самостоятельно.

С чего мне начинать, за что браться?

Спасибо.

Автор: Олег2005 15.2.2011, 16:08
Протокол ICMP+RAW-сокеты

Автор: metoflex 15.2.2011, 21:07
Спасибо! Буду пробовать, изучать!

Автор: GrayCardinal 16.2.2011, 18:31
Есть шняга 
libnet
http://packetfactory.openwall.net/projects/libnet/
Спецом для этих целей (клепание пакетов)

Автор: metoflex 22.2.2011, 13:34
Начал изучение.... столкнулся с проблемой. У меня не создается сокет..

В данной проверке:

Код

 if ((mysocket = socket(AF_INET,SOCK_RAW,IPPROTO_RAW)) == INVALID_SOCKET)
    {
        // Ошибка!
    }


Сваливается в ошибку. Перепробовал все абсолютно параметры у ф-ии socket (кроме среднего, т.к. необходимы сырые пакеты).

Подскажите, в чем облажался?

Автор: metoflex 22.2.2011, 13:55
Библиотеку задействую так:

Код

if (WSAStartup(0x0202, (WSADATA *)&buff[0]))
    {
        // Ошибка!
        printf("Error WSAStartup %d\n", WSAGetLastError());
        return -1;
    }

Автор: metoflex 22.2.2011, 14:38
Всё заработало, стоило контроль учетной записью полностью отключить (UAC).

Автор: metoflex 28.2.2011, 02:50
Столкнулся с проблемой, при формировании ICMP пакета и его отправке.

Все сетевые ф-ии возвращают нули, до sendto.. она выдает
 -1.


Скажите пожалуйста, где я ошибся, вот листинг программы:

MainTrace.cpp

Код
#include "stdafx.h"
#include "CTrace.h"
#include "winsock2.h"
#include <string>

#define PORT_ADDR 0
#define SERVERADDR "212.92.138.197"

int main()
{
    CTrace socket_str;
    char buff[8];
    int raw_socket=0;
    char* getinformation;
    char ip[17];
    int k=0;
    char *buf;
    int rc;
    char buffer2[1024];

    if (WSAStartup(0x0202, (WSADATA *)&buff))
    {
        // Error
        printf("Error WSAStartup %d\n", WSAGetLastError());
        return -1;
    }
    getinformation = new char (8);
                                  

    DWORD tout = 60 * 1000;    //One minute

    sockaddr_in *dest_addr;
    dest_addr = new sockaddr_in;
    dest_addr->sin_family = AF_INET;
    dest_addr->sin_port = htons(PORT_ADDR); 
    dest_addr->sin_addr.s_addr = inet_addr(SERVERADDR);

    raw_socket=socket_str.CreateSocket();

    k=setsockopt(raw_socket, SOL_SOCKET, SO_RCVTIMEO, (char*) &tout, sizeof(tout));

    icmpdg *packet;
    packet = new icmpdg;
    packet->type=8;
    packet->chksum=0;
    packet->code=0;
    packet->num=0;
    packet->id=0;

    buf=(char*)packet;

    k=sendto(raw_socket, buf, sizeof(buf), 0, (sockaddr*) &dest_addr, sizeof(dest_addr));

    rc = recvfrom(raw_socket,buffer2,sizeof(buffer2),0,(sockaddr*)&dest_addr, (int*)sizeof(dest_addr));

    return 0;
}


CTrace.cpp

Код
#include "StdAfx.h"
#include "CTrace.h"
#pragma comment(lib,"Ws2_32.lib")
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>
#include <stdlib.h>   // Needed for _wtoi


CTrace::CTrace(void)
{
    
}

unsigned int CTrace::CreateSocket()
{

 SOCKET mysocket;
    if ((mysocket = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) == INVALID_SOCKET)
    {
        // Ошибка!
        printf("Error socket %d\n", WSAGetLastError());
        WSACleanup(); 
        return NULL;
    }
    return mysocket;
}


CTrace::~CTrace(void)
{
}


Ctrace.h

Код
#pragma once
class CTrace
{
public:
    CTrace(void);
    unsigned int CreateSocket();
    int ConnectSocketLocalAddress(int socket);
    char* CreatePack(char* package);
    /*
    void SendMess(int socket);*/
    ~CTrace(void);
};




struct icmpdg // структура заголовка ICMP датаграммы 

{
char type;
char code;
short chksum;
short id;
short num;
};


Огромное Спасибо!!!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)