Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C/C++ Сетевое программирование
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.02.2011, 10:02   #1
metoflex
Пользователь
 
Регистрация: 21.06.2009
Сообщений: 37
Восклицание Trace ICMP

Здравствуйте!

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

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

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

Спасибо.
metoflex вне форума Ответить с цитированием
Старый 15.02.2011, 20:12   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

c RFC на ICMP
p51x вне форума Ответить с цитированием
Старый 15.02.2011, 21:06   #3
metoflex
Пользователь
 
Регистрация: 21.06.2009
Сообщений: 37
По умолчанию

Спасибо! Буду пробовать, изучать!
metoflex вне форума Ответить с цитированием
Старый 22.02.2011, 13:34   #4
metoflex
Пользователь
 
Регистрация: 21.06.2009
Сообщений: 37
По умолчанию

Начал изучение.... столкнулся с проблемой. У меня не создается сокет..

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


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

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

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

Последний раз редактировалось metoflex; 22.02.2011 в 13:38.
metoflex вне форума Ответить с цитированием
Старый 22.02.2011, 14:39   #5
metoflex
Пользователь
 
Регистрация: 21.06.2009
Сообщений: 37
По умолчанию

Всё заработало, стоило контроль учетной записью полностью отключить (UAC).
metoflex вне форума Ответить с цитированием
Старый 28.02.2011, 02:51   #6
metoflex
Пользователь
 
Регистрация: 21.06.2009
Сообщений: 37
По умолчанию

Столкнулся с проблемой, при формировании 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;
};
Огромное Спасибо!!!
metoflex вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ICMP-сообщения Черничный Работа с сетью в Delphi 3 22.09.2008 22:06