powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Помогите разобратся с IP адресами
25 сообщений из 39, страница 1 из 2
Помогите разобратся с IP адресами
    #34297946
Lepaj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго всем времени суток :)

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

Пишу программу на Си, использую сокеты, но когда начинаю анализировать поступивший пакет мне вместо реальных 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
Помогите разобратся с IP адресами
    #34297974
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Открой для себя htonl, ну и htons для кучи :)
Дело в том, что в Internet принят другой порядок байт, противоположный к хостовому Intel-а
Нужно просто переставить байтики
...
Рейтинг: 0 / 0
Помогите разобратся с IP адресами
    #34298126
SnowMan2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чтото мне сдается, что recv не берет Header. Сам определял обратный адрес из функции accept (при передаче с каналом) или recfrom (без канала)
...
Рейтинг: 0 / 0
Помогите разобратся с IP адресами
    #34298143
Lepaj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А можно пример или ссылку на документацию по данным функциям?
...
Рейтинг: 0 / 0
Помогите разобратся с IP адресами
    #34298160
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор
НАЗВАНИЕ
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
Помогите разобратся с IP адресами
    #34298167
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообщем, htonl для адреса, htons для порта.

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

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

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

01111111 00000000 00000000 00000001

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

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

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

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

01111111 00000000 00000000 00000001


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

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

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

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

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

Ты же сам уже написал, что для этого есть inet_ntoa. :)
...
Рейтинг: 0 / 0
Помогите разобратся с IP адресами
    #34298625
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Помогите разобратся с IP адресами
    #34298637
Lepaj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gluk (Kazan)
Странно, а я всегда думал, что 4 октета по 8 бит дадут 32 бита
Пойду подучу арифметику

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

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

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

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

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


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

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

Плановое хозяйство это СИЛА ;)
...
Рейтинг: 0 / 0
Помогите разобратся с IP адресами
    #34299032
Lepaj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Помогите разобратся с IP адресами
    #34299347
Lepaj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SnowMan2Чтото мне сдается, что recv не берет Header. Сам определял обратный адрес из функции accept (при передаче с каналом) или recfrom (без канала)

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

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

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

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

Задача заключается в следующем. Организуется TCP сокет на прослушивание, ему посылается сообщение, программа работает как ретранслятор, получив сообщение она должна переслать его дальше по ssl, т.е. как узнать от кого пришло данное сообщение, длина... В коде я привел структуру, которую выдернул из одного снифера, почему не привел другой код, по тому что там все как в учебнике, организуется сокет.
...
Рейтинг: 0 / 0
Помогите разобратся с IP адресами
    #34299647
Карабас Барабас
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
25 сообщений из 39, страница 1 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / Помогите разобратся с IP адресами
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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