Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Помогите разобратся с IP адресами / 25 сообщений из 39, страница 1 из 2
01.02.2007, 08:28
    #34297946
Lepaj
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобратся с IP адресами
Доброго всем времени суток :)

Вот возникла проблема:

Пишу программу на Си, использую сокеты, но когда начинаю анализировать поступивший пакет мне вместо реальных IP пишет какую-то муть :(

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
typedef struct IPHeader {
  UCHAR   iph_verlen;   
  UCHAR   iph_tos;     
  USHORT  iph_length;   
  USHORT  iph_id;       
  USHORT  iph_offset;  
  UCHAR   iph_ttl;      
  UCHAR   iph_protocol; 
  USHORT  iph_xsum;    
  ULONG   iph_src;      // IP отправителя
  ULONG   iph_dest;    // IP получателя
} IPHeader;

IN_ADDR pack_adr;
...

  rec = recv(cli_disc, buf, sizeof(buf),  0 );

...

  IPHeader* hdr = (IPHeader *)buf;
                                  
  printf(" From : ");
  pack_adr.s_addr = hdr->iph_src;
  printf(inet_ntoa(pack_adr));

  printf(" To : ");
  pack_adr.s_addr = hdr->iph_dest;
  printf(inet_ntoa(pack_adr));

IP которые выводятся на экран неимеют ничего общего с реальными.
...
Рейтинг: 0 / 0
01.02.2007, 08:41
    #34297974
Gluk (Kazan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобратся с IP адресами
Открой для себя htonl, ну и htons для кучи :)
Дело в том, что в Internet принят другой порядок байт, противоположный к хостовому Intel-а
Нужно просто переставить байтики
...
Рейтинг: 0 / 0
01.02.2007, 09:46
    #34298126
SnowMan2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобратся с IP адресами
Чтото мне сдается, что recv не берет Header. Сам определял обратный адрес из функции accept (при передаче с каналом) или recfrom (без канала)
...
Рейтинг: 0 / 0
01.02.2007, 09:53
    #34298143
Lepaj
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобратся с IP адресами
А можно пример или ссылку на документацию по данным функциям?
...
Рейтинг: 0 / 0
01.02.2007, 09:57
    #34298160
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобратся с IP адресами
автор
НАЗВАНИЕ
htonl, htons, ntohl, ntohs - переводят данные из узлового порядкарасположения байтов в сетевой и наоборот

СИНТАКСИС
#include <netinet/in.h>

uint32_t htonl(uint32_t hostlong);

uint16_t htons(uint16_t hostshort);

uint32_t ntohl(uint32_t netlong);

uint16_t ntohs(uint16_t netshort);

ОПИСАНИЕ
Функция htonl() преобразует узловой порядок расположениябайтов положительного целого hostlong в сетевой порядок распол
ожения байтов.

Функция htons() преобразует узловой порядок расположения байтовположительного короткого целого hostshort в сетевой пор
ядок расположения байтов.

Функция ntohl() преобразует сетевой порядок расположения байтовположительного целого netlong в узловой порядок располо
жения байтов.

Функция ntohs() преобразует сетевой порядок расположения байтовположительного короткого целого netshort в узловой поря
док расположения байтов.

В архитектуре i80x86 узловой порядок расположения байтов - этотакой порядок, при котором последний значимый байт стоит
в начале числа, а при сетевом порядке расположения байтов, используемом в интернет, наоборот: первый значимый байт сто
ит в начале числа.
...
Рейтинг: 0 / 0
01.02.2007, 10:00
    #34298167
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобратся с IP адресами
Вообщем, htonl для адреса, htons для порта.

Остальные две, соответсвенно, наоборот.
...
Рейтинг: 0 / 0
01.02.2007, 10:05
    #34298182
Lepaj
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобратся с IP адресами
В общем понятно, а как сее в printf вывести? Какой формат?
...
Рейтинг: 0 / 0
01.02.2007, 10:08
    #34298188
Gluk (Kazan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобратся с IP адресами
LepajВ общем понятно, а как сее в printf вывести? Какой формат?

4 байта - 4 октета адреса ;)
...
Рейтинг: 0 / 0
01.02.2007, 10:45
    #34298341
Lepaj
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобратся с IP адресами
Gluk (Kazan)
4 байта - 4 октета адреса ;)

Т.е. получается, что возвращается 24 байта?
Например адрес 127.0.0.1 будет иметь вид:

01111111 00000000 00000000 00000001

или же возвращается другое значение? так как я понял ф-ция inet_ntoa() сама преобразует значение в читабельный формат, а что возвращается в ф-ции htonl?

если можно, дайте пожайлуста пример вывода на экран (printf) значения возвращаемого htonl...

P.S.: Извините за тупой вопрос, но я только учусь работать с сокетами и пока имею довольно туманное представления о них...
...
Рейтинг: 0 / 0
01.02.2007, 11:10
    #34298440
Gluk (Kazan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобратся с IP адресами
Lepaj Gluk (Kazan)
4 байта - 4 октета адреса ;)

Т.е. получается, что возвращается 24 байта?
Например адрес 127.0.0.1 будет иметь вид:

01111111 00000000 00000000 00000001


Loopback ты нарисовал правильно.
Одного не пойму, 24 то откуда взялось ???
...
Рейтинг: 0 / 0
01.02.2007, 11:38
    #34298564
Lepaj
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобратся с IP адресами
Gluk (Kazan)
Loopback ты нарисовал правильно.
Одного не пойму, 24 то откуда взялось ???

24 байта, занимает адрес 4 числа по 8 байт дает 24 байта, вот только как их в си преобразовать и вывести на экран?
...
Рейтинг: 0 / 0
01.02.2007, 11:40
    #34298577
Gluk (Kazan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобратся с IP адресами
Lepaj Gluk (Kazan)
Loopback ты нарисовал правильно.
Одного не пойму, 24 то откуда взялось ???

24 байта, занимает адрес 4 числа по 8 байт дает 24 байта, вот только как их в си преобразовать и вывести на экран?

Странно, а я всегда думал, что 4 октета по 8 бит дадут 32 бита
Пойду подучу арифметику
...
Рейтинг: 0 / 0
01.02.2007, 11:40
    #34298578
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобратся с IP адресами
Lepaj Gluk (Kazan)
Loopback ты нарисовал правильно.
Одного не пойму, 24 то откуда взялось ???

24 байта, занимает адрес 4 числа по 8 байт дает 24 байта, вот только как их в си преобразовать и вывести на экран?

Ты же сам уже написал, что для этого есть inet_ntoa. :)
...
Рейтинг: 0 / 0
01.02.2007, 11:49
    #34298625
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобратся с IP адресами
Lepaj, не путай строчное представление адреса, узловое и сетевое. Читай документацию, что я тебе запостил, + ниже следующую и все вопросы сами отпадут.

автор
НАЗВАНИЕ
inet_aton, inet_addr, inet_network, inet_ntoa, inet_makeaddr, inet_lnaof, inet_netof - работа с адресами интернет

СИНТАКСИС
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int inet_aton(const char *cp, struct in_addr *inp);

in_addr_t inet_addr(const char *cp);

in_addr_t inet_network(const char *cp);

char *inet_ntoa(struct in_addr in);

struct in_addr inet_makeaddr(int net, int host);

in_addr_t inet_lnaof(struct in_addr in);

in_addr_t inet_netof(struct in_addr in);

ОПИСАНИЕ
inet_aton() преобразовывает обычный вид IP-адреса cp (из номеров и точек) в двоичный код и сохраняет его в структуре,
на которую указывает inp. inet_aton возвращает ненулевое значение, если адрес правильный, и возвращает ноль, если он н
еверен.

Функция inet_addr() преобразует обычный вид IP-адреса cp (из номеров и точек) в двоичный код в сетевом порядке располо
жения байтов. Если входящий адрес неверен, то возвращается INADDR_NONE (обычно -1). Это - устаревший способ, посколь
ку уже существует inet_aton, описанный выше; способ также считается устаревшим, потому что -1 фактически являетсяправи
льным адресом (255.255.255.255), а inet_aton четко определяет, есть ошибкав адресе или нет.

Функция inet_network() извлекает сетевой номерв хостовом порядке расположения байтовиз адреса cp, записанном в виде но
меров и точек. Если входящий адрес неверен, то возвращается -1.

Функция inet_ntoa() преобразует IP-адрес in, заданный в сетевом порядке расположения байтов, в стандартный строчный ви
д, из номеров и точек. Строка располагается в статически размещенном буфере; последующие вызовы перепишут его данные.

Ф ункция inet_makeaddr() создает IP-адрес в сетевом порядке расположения байтов, комбинируя номер сети net с локальным
адресом host в сети net (оба в хостовом порядке расположения байтов).

Функция inet_lnaof() возвращает часть адреса для локального хостаиз IP-адреса in. Адрес локального хоста возвращается
в хостовом порядкеразмещения байтов.

Функция inet_netof() возвращает сетевую часть IP-адреса in. Сетевой номер возвращается в виде байтов, порядок которых
определяетсясистемой локального хоста.

Структура in_addr, используемая в функциях inet_ntoa(), inet_makeaddr(), inet_lnoaf() и inet_netof(), определе н а в
netinet/in.h таким образом:

struct in_addr {
unsigned long int s_addr;
}

Заметим, что для i80x86 хостовый порядок расположения байтовозначает размещение сначала наименьшего значащего байта, а
сетевой порядок расположения байтов (используемый в интернет) подразумевает размещение в начале наибольшего значимог о
байта.
...
Рейтинг: 0 / 0
01.02.2007, 11:52
    #34298637
Lepaj
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобратся с IP адресами
Gluk (Kazan)
Странно, а я всегда думал, что 4 октета по 8 бит дадут 32 бита
Пойду подучу арифметику

блин, ну прокосячил :( пойду тоже арифметику учить :)

AkhТы же сам уже написал, что для этого есть inet_ntoa. :)

Ну так inet_ntoa неправильный результат возвращает.
...
Рейтинг: 0 / 0
01.02.2007, 12:18
    #34298739
Карабас Барабас
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобратся с IP адресами
Gluk (Kazan)Пойду подучу арифметику тут не в арифметике дело, а в плане :)
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
01.02.2007, 12:31
    #34298813
SnowMan2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобратся с IP адресами
Тут в 5-ой главе про сокеты хорошо сказано

http://www.lcard.ru/~nail/frolov/bsp/v23/home.htm
...
Рейтинг: 0 / 0
01.02.2007, 13:01
    #34298940
Lepaj
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобратся с IP адресами
Gluk (Kazan)
Дело в том, что в Internet принят другой порядок байт, противоположный к хостовому Intel-а
Нужно просто переставить байтики

Akh
ОПИСАНИЕ
Функция htonl() преобразует узловой порядок расположениябайтов положительного целого hostlong в сетевой порядок распол
ожения байтов.


Т.е. получается, что функция htonl() меняет порядок байтов на сетевой, а inet_ntoa() преобразует к читабельному строчнуму виду...

Но почему компилятор ругается на такую конструкцию printf("%s",inet_ntoa(inet_ntoa(htonl(pack_adr)));?
...
Рейтинг: 0 / 0
01.02.2007, 13:01
    #34298945
Gluk (Kazan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобратся с IP адресами
Карабас Барабас Gluk (Kazan)Пойду подучу арифметику тут не в арифметике дело, а в плане :)
Posted via ActualForum NNTP Server 1.3

Плановое хозяйство это СИЛА ;)
...
Рейтинг: 0 / 0
01.02.2007, 13:25
    #34299032
Lepaj
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобратся с IP адресами
Lepaj
Но почему компилятор ругается на такую конструкцию printf("%s",inet_ntoa(inet_ntoa(htonl(pack_adr)));?

Пришел к такой конструкции :

pack_adr.s_addr = hdr->iph_src;
pack_adr.s_addr = ntohl(pack_adr.s_addr);
printf("%s",inet_ntoa(pack_adr));

но, все равно на экран выводит неправильные IP.
...
Рейтинг: 0 / 0
01.02.2007, 14:43
    #34299347
Lepaj
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобратся с IP адресами
SnowMan2Чтото мне сдается, что recv не берет Header. Сам определял обратный адрес из функции accept (при передаче с каналом) или recfrom (без канала)

Долго мучался с приведенно выше конструкцией, но постоянно получаю разные IP :(
А как вытащить IP из accept?
...
Рейтинг: 0 / 0
01.02.2007, 15:35
    #34299541
Lepaj
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобратся с IP адресами
Уважаемые Гуру, дайте хотя бы намек, или алгоритм, как распотрашить пакет :) Что бы можно было бы вытащить из полученного пакета адрес отправителя, адрес получателя и т.д.
...
Рейтинг: 0 / 0
01.02.2007, 15:52
    #34299601
Gluk (Kazan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобратся с IP адресами
ты ж задачу толком не описал, какие тебе намеки ???
TCP, UDP или слушаешь сырой сокет ? из твоих слов совершенно непонятно.
Какой-то обрывок кода :(

Что тебе посоветовать ? Как правильно задавать вопросы ???
...
Рейтинг: 0 / 0
01.02.2007, 16:01
    #34299641
Lepaj
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобратся с IP адресами
Gluk (Kazan)ты ж задачу толком не описал, какие тебе намеки ???
TCP, UDP или слушаешь сырой сокет ? из твоих слов совершенно непонятно.
Какой-то обрывок кода :(

Что тебе посоветовать ? Как правильно задавать вопросы ???

Пардон... Некоректно сформулировал вопрос...

Задача заключается в следующем. Организуется TCP сокет на прослушивание, ему посылается сообщение, программа работает как ретранслятор, получив сообщение она должна переслать его дальше по ssl, т.е. как узнать от кого пришло данное сообщение, длина... В коде я привел структуру, которую выдернул из одного снифера, почему не привел другой код, по тому что там все как в учебнике, организуется сокет.
...
Рейтинг: 0 / 0
01.02.2007, 16:02
    #34299647
Карабас Барабас
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобратся с IP адресами
blcksock.pas
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
 function  TBlockSocket.GetSinIP(Sin: TSockAddrIn):  string ;
 var 
  p: PChar;
 begin 
  p := synsock.inet_ntoa(Sin.sin_addr);
   if  p =  nil   then 
    Result := ''
   else 
    Result := p;
 end ;

TSockAddrIn represents the Internet socket address structure used in Windows socket API calls to represent the full specification of a socket port.

Unit

Winsock

typedef sockaddr_in TSockAddrIn;

Description

TSockAddrIn represents a Windows socket address, including information about the host, port, and protocol.

Код: plaintext
1.
2.
3.
4.
5.
struct sockaddr_in {
        short   sin_family;
        u_short sin_port;
        struct  in_addr sin_addr;
        char    sin_zero[ 8 ];
};

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Помогите разобратся с IP адресами / 25 сообщений из 39, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]