URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 5436
[ Назад ]

Исходное сообщение
"Ламерский вопрос по htonl."

Отправлено ufobject , 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...
Заранее огромное спасибо за помощь!!!


Содержание

Сообщения в этом обсуждении
"Ламерский вопрос по htonl."
Отправлено chip , 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 *) приведение к данному указетелю.


"Ламерский вопрос по htonl."
Отправлено Resident , 19-Май-06 21:45 
#ifndef _NO_SPAM_

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

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

#endif

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


"Ламерский вопрос по htonl."
Отправлено Grey , 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


"Ламерский вопрос по htonl."
Отправлено ufobject , 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

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


"Ламерский вопрос по htonl."
Отправлено ufobject , 20-Май-06 20:46 

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

"Ламерский вопрос по htonl."
Отправлено ufobject , 20-Май-06 20:47 

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

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



"Ламерский вопрос по htonl."
Отправлено Buggs , 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