Привет 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...
Заранее огромное спасибо за помощь!!!
>Привет 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 *) приведение к данному указетелю.
#ifndef _NO_SPAM_>K&R "Язык программирования Си" ОБЯЗАТЕЛЬНО.
Имхо, достаточно Страуструппа 3-ие издание, там и про С хоть и коротко, но зато очень многое открывает, в том числе и то, чего нет у КР. :)
#endif
Bedjee's guid to network programing читали (за написание имени не ручаюсь, но читается так)? Если нет, то советую почитать, даже видел целый курс в вузе, построенный на этом гиде, семестр студентам мозг мучают тем, что Биджи уложил в 2 часа чтения, при чем просто и ясно.
>Привет 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
>>Привет 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Спасибо огромное!
Еще маленький вопрос....
>>connect (sock, (struct sockaddr *) &addr, sizeof(addr))
> &addr - адрес addr, (struct sockaddr *) приведение к данному указетелю.
Неужели никак проще нельзя "(struct sockaddr *) &addr" заменить? И почему в C компилится и работает просто "addr", а в C++ надо такой
Еще маленький вопрос....
>>connect (sock, (struct sockaddr *) &addr, sizeof(addr))
> &addr - адрес addr, (struct sockaddr *) приведение к данному указетелю.
Неужели никак проще нельзя "(struct sockaddr *) &addr" заменить? И почему в C компилится и работает просто "addr", а в C++ надо такой вираж выделывать?
Запомните раз и навсегда: C и C++ это разные языки программирования. Пусть ихняя похожесть не вводит вас в заблуждение.
>[оверквотинг удален]
>>>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