The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Ламерский вопрос по htonl."
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (C/C++)
Изначальное сообщение [ Отслеживать ]

"Ламерский вопрос по htonl."  +/
Сообщение от ufobject email(??) on 19-Май-06, 15:40 
Привет all!
Разбираю тут код по работе с сокетами на C++ под linux. Встретился кусочек:
addr.sin_port = htons(3425); //С этим все ясно. Порт в открытом виде.
addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); //Тут не понятно
connect (sock, (struct sockaddr *) &addr, sizeof(addr)) //Тут тоже...

Так вот, у меня 2 ламерских вопроса по этому небольшому кусочку.
1) htonl(INADDR_LOOPBACK) я понимаю что INADDR_LOOPBACK это петля 127.0.0.1, но когда я попытлася передать какойнить свой IP, например 10.0.0.1, то столкнулся с проблемой... Как мне через char * передать в эту htonl свои данные? Я понимаю что функция ест uint32_t, но я к сожалению еще ни разу не работал с этим типом, а тем более как мне из юзерских данных, переданных в мою функцию через "char *USER_IP", скормить их htonl'у или лучше сразу сразу конвертировать в понятную циферку addr.sin_addr.s_addr'a...????
2) Очередной заковырк с указателями для новичка: (struct sockaddr *) &addr.
Не очень понимаю что сие произведение делает... Если можно, поясни, all...
Заранее огромное спасибо за помощь!!!

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Ламерский вопрос по htonl."  +/
Сообщение от chip email(ok) on 19-Май-06, 17:07 
>Привет all!
>Разбираю тут код по работе с сокетами на C++ под linux. Встретился
>кусочек:
>addr.sin_port = htons(3425); //С этим все ясно. Порт в открытом виде.
>addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); //Тут не понятно
>connect (sock, (struct sockaddr *) &addr, sizeof(addr)) //Тут тоже...
>
>Так вот, у меня 2 ламерских вопроса по этому небольшому кусочку.
>1) htonl(INADDR_LOOPBACK) я понимаю что INADDR_LOOPBACK это петля 127.0.0.1,

Feel the difference:

#define      INADDR_LOOPBACK         0x7f000001      /* 127.0.0.1   */

inet_addr("127.0.0.1")

>2) Очередной заковырк с указателями для новичка: (struct sockaddr *) &addr.
>Не очень понимаю что сие произведение делает... Если можно, поясни, all...
>Заранее огромное спасибо за помощь!!!

K&R "Язык программирования Си" ОБЯЗАТЕЛЬНО.

&addr - адрес addr, (struct sockaddr *) приведение к данному указетелю.

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

3. "Ламерский вопрос по htonl."  +/
Сообщение от Resident email on 19-Май-06, 21:45 
#ifndef _NO_SPAM_

>K&R "Язык программирования Си" ОБЯЗАТЕЛЬНО.

Имхо, достаточно Страуструппа 3-ие издание, там и про С хоть и коротко, но зато очень многое открывает, в том числе и то, чего нет у КР. :)

#endif

Bedjee's guid to network programing читали (за написание имени не ручаюсь, но читается так)? Если нет, то советую почитать, даже видел целый курс в вузе, построенный на этом гиде, семестр студентам мозг мучают тем, что Биджи уложил в 2 часа чтения, при чем просто и ясно.

Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

2. "Ламерский вопрос по htonl."  +/
Сообщение от Grey (??) on 19-Май-06, 19:58 
>Привет all!
>Разбираю тут код по работе с сокетами на C++ под linux. Встретился
>кусочек:
>addr.sin_port = htons(3425); //С этим все ясно. Порт в открытом виде.
>addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); //Тут не понятно
>connect (sock, (struct sockaddr *) &addr, sizeof(addr)) //Тут тоже...
>
>Так вот, у меня 2 ламерских вопроса по этому небольшому кусочку.
>1) htonl(INADDR_LOOPBACK) я понимаю что INADDR_LOOPBACK это петля 127.0.0.1, но когда я
>попытлася передать какойнить свой IP, например 10.0.0.1, то столкнулся с проблемой...
>Как мне через char * передать в эту htonl свои данные?
>Я понимаю что функция ест uint32_t, но я к сожалению еще
>ни разу не работал с этим типом, а тем более как
>мне из юзерских данных, переданных в мою функцию через "char *USER_IP",
>скормить их htonl'у или лучше сразу сразу конвертировать в понятную циферку
>addr.sin_addr.s_addr'a...????
>2) Очередной заковырк с указателями для новичка: (struct sockaddr *) &addr.
>Не очень понимаю что сие произведение делает... Если можно, поясни, all...
>Заранее огромное спасибо за помощь!!!


Все очень просто. В сети данные не представляются в формате с точкой, а представляются 32 битным числом например loopback 0x7f000001 а htonl нужен для того, чтобы перевести порядок следования байт из машинного в сетевой. так что если хочешь использовать 10.0.0.1 используй число 0x10000001

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

4. "Ламерский вопрос по htonl."  +/
Сообщение от ufobject email(??) on 20-Май-06, 20:42 
>>Привет all!
>>Разбираю тут код по работе с сокетами на C++ под linux. Встретился
>>кусочек:
>>addr.sin_port = htons(3425); //С этим все ясно. Порт в открытом виде.
>>addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); //Тут не понятно
>>connect (sock, (struct sockaddr *) &addr, sizeof(addr)) //Тут тоже...
>>
>>Так вот, у меня 2 ламерских вопроса по этому небольшому кусочку.
>>1) htonl(INADDR_LOOPBACK) я понимаю что INADDR_LOOPBACK это петля 127.0.0.1, но когда я
>>попытлася передать какойнить свой IP, например 10.0.0.1, то столкнулся с проблемой...
>>Как мне через char * передать в эту htonl свои данные?
>>Я понимаю что функция ест uint32_t, но я к сожалению еще
>>ни разу не работал с этим типом, а тем более как
>>мне из юзерских данных, переданных в мою функцию через "char *USER_IP",
>>скормить их htonl'у или лучше сразу сразу конвертировать в понятную циферку
>>addr.sin_addr.s_addr'a...????
>>2) Очередной заковырк с указателями для новичка: (struct sockaddr *) &addr.
>>Не очень понимаю что сие произведение делает... Если можно, поясни, all...
>>Заранее огромное спасибо за помощь!!!
>
>
>Все очень просто. В сети данные не представляются в формате с точкой,
>а представляются 32 битным числом например loopback 0x7f000001 а htonl нужен
>для того, чтобы перевести порядок следования байт из машинного в сетевой.
>так что если хочешь использовать 10.0.0.1 используй число 0x10000001

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

Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

5. "Ламерский вопрос по htonl."  +/
Сообщение от ufobject email(??) on 20-Май-06, 20:46 

Еще маленький вопрос....
>>connect (sock, (struct sockaddr *) &addr, sizeof(addr))
> &addr - адрес addr, (struct sockaddr *) приведение к данному указетелю.
Неужели никак проще нельзя "(struct sockaddr *) &addr" заменить? И почему в C компилится и работает просто "addr", а в C++ надо такой
Ответить | Правка | ^ к родителю #4 | Наверх | Cообщить модератору

6. "Ламерский вопрос по htonl."  +/
Сообщение от ufobject email(??) on 20-Май-06, 20:47 

Еще маленький вопрос....
>>connect (sock, (struct sockaddr *) &addr, sizeof(addr))
> &addr - адрес addr, (struct sockaddr *) приведение к данному указетелю.
Неужели никак проще нельзя "(struct sockaddr *) &addr" заменить? И почему в C компилится и работает просто "addr", а в C++ надо такой вираж выделывать?
Ответить | Правка | ^ к родителю #4 | Наверх | Cообщить модератору

7. "Ламерский вопрос по htonl."  +/
Сообщение от gyn61 (??) on 21-Май-06, 00:12 
Запомните раз и навсегда: C и C++ это разные языки программирования. Пусть ихняя похожесть не вводит вас в заблуждение.


Ответить | Правка | ^ к родителю #6 | Наверх | Cообщить модератору

8. "Ламерский вопрос по htonl."  +/
Сообщение от Buggs email on 03-Апр-11, 19:15 
>[оверквотинг удален]
>>>2) Очередной заковырк с указателями для новичка: (struct sockaddr *) &addr.
>>>Не очень понимаю что сие произведение делает... Если можно, поясни, all...
>>>Заранее огромное спасибо за помощь!!!
>>
>>
>>Все очень просто. В сети данные не представляются в формате с точкой,
>>а представляются 32 битным числом например loopback 0x7f000001 а htonl нужен
>>для того, чтобы перевести порядок следования байт из машинного в сетевой.
>>так что если хочешь использовать 10.0.0.1 используй число 0x10000001
> Спасибо огромное!

Не верно  аргумент htonl long int 10.0.0.1 = 10*256^3+0*256^2+0*256+1=0xA000001


Ответить | Правка | ^ к родителю #4 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру