|
Модераторы: feodorv |
|
konshyn |
|
|||
Опытный Профиль Группа: Участник Сообщений: 295 Регистрация: 19.9.2013 Репутация: нет Всего: нет |
Ребят, нет возможности проверить (ни одной машины нет с нужным порядком байт)
У меня на машине little-endian порядок байт, сетевой порядок байт - big-endian. Так вот, хочу работать с заголовками с помощью битовых операций. Пример:
и я получаю именно тот порт, с которого была отправлена датаграмма. я так понимаю, с порядком big-endian на машине я получу такой же результат. но вот загвоздка, если у меня little-endian, то мне нужно опять использовать htons(), чтобы записать этот порт, к примеру, в sockaddr_in, а если big-endian - не нужно. Как сделать это элегентно, и с возможностью работать через битовые операции (намного удобнее, чем через всякие структуры и просто копирование. по крайне мере мне так нравится ) ? -------------------- «Потому что ценность акта действия в этой стране возрастает в несколько раз». |
|||
|
||||
volatile |
|
|||
Эксперт Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: нет Всего: 85 |
Неверно. htons() следует использвать в любом случае. На машине, где это нужно она перевернет порядок байт, а на машине,где не нужно - ничего делать не будет. htons(), ntohs() и подобые, специально придуманы чтоби писать платформонезависимый код. А возится с порядком байт вручную, не стоит. Это сообщение отредактировал(а) volatile - 6.8.2014, 17:58 |
|||
|
||||
konshyn |
|
||||
Опытный Профиль Группа: Участник Сообщений: 295 Регистрация: 19.9.2013 Репутация: нет Всего: нет |
Почему неверено? Верно, дальше по тексту вы сами объясняете, что будет
Верно, но, к примеру, когда я принимаю через recvfrom() датаграмму, т.е. я туда еще отправляю структуру sockaddr_in, чтобы мне ядро скинуло ip-адрес отправителя, то этот ip-адрес записан в big-endian порядке. Жаль, что порт туда не записывается. хотя, структура sockaddr_in специально для AF_INET сделана, другими словами для TCP и UDP. они имеют поля портов на одном и том же месте в своем заголовке - в начале. логично было бы делать это. так вот, я бы хотел делать как писал выше, но для этого придется писать htons(), но, если я буду делать как делают все, то не нужно, т.к. они уже записаны в big-endian порядке. Думал-думал, как элегантно сделать, но не придумал...придется как всегда:(
Это сообщение отредактировал(а) konshyn - 6.8.2014, 18:28 -------------------- «Потому что ценность акта действия в этой стране возрастает в несколько раз». |
||||
|
|||||
feodorv |
|
||||
Эксперт Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 10 Всего: 45 |
Что Вы имеете в виду?
Всё записывается. Добавлено через 2 минуты и 58 секунд
-------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
||||
|
|||||
konshyn |
|
|||
Опытный Профиль Группа: Участник Сообщений: 295 Регистрация: 19.9.2013 Репутация: нет Всего: нет |
-------------------- «Потому что ценность акта действия в этой стране возрастает в несколько раз». |
|||
|
||||
feodorv |
|
|||
Эксперт Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 10 Всего: 45 |
И я имел в виду из функции recvfrom(). Приведённый код как раз выполняется после recvfrom [UDP]. -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
konshyn |
|
||||||||
Опытный Профиль Группа: Участник Сообщений: 295 Регистрация: 19.9.2013 Репутация: нет Всего: нет |
У меня почему-то на сырой сокет порт не записывается
Добавлено через 1 минуту и 16 секунд отправляю пакет вот так:
-------------------- «Потому что ценность акта действия в этой стране возрастает в несколько раз». |
||||||||
|
|||||||||
tzirechnoy |
|
|||
Эксперт Профиль Группа: Завсегдатай Сообщений: 1173 Регистрация: 30.1.2009 Репутация: 1 Всего: 16 |
http://commandcenter.blogspot.ru/2012_04_01_archive.html
Добавлено через 3 минуты и 15 секунд Ровно обратным порядком: buffer[0] = post&0x0F; buffer[1] = (port >> 8)&0x0F; Впрочем, htons можно просто вставлять всегда. |
|||
|
||||
konshyn |
|
|||
Опытный Профиль Группа: Участник Сообщений: 295 Регистрация: 19.9.2013 Репутация: нет Всего: нет |
можно, но: этот вариант намного красивей) -------------------- «Потому что ценность акта действия в этой стране возрастает в несколько раз». |
|||
|
||||
feodorv |
|
|||
Эксперт Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 10 Всего: 45 |
Гм. Сделайте честную отправку пакета через sendto. Что там с /dev/udp, я не знаю. -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
konshyn |
|
||||||
Опытный Профиль Группа: Участник Сообщений: 295 Регистрация: 19.9.2013 Репутация: нет Всего: нет |
Вот код:
вот результат одно из пакетов:
Добавлено через 6 минут и 52 секунды Но если делать не сырой сокет, а обычный датаграммный (верхнуюю часть заменить на это)
то да, recvfrom пишет в sin_port номер порта, с которого пришел пакет. Все дело в сыром сокете. -------------------- «Потому что ценность акта действия в этой стране возрастает в несколько раз». |
||||||
|
|||||||
feodorv |
|
|||
Эксперт Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 10 Всего: 45 |
Ага. Видимо, сетевой уровень в этом случае не разбирает датаграмму... -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
konshyn |
|
|||
Опытный Профиль Группа: Участник Сообщений: 295 Регистрация: 19.9.2013 Репутация: нет Всего: нет |
Но source IP записывает. -------------------- «Потому что ценность акта действия в этой стране возрастает в несколько раз». |
|||
|
||||
feodorv |
|
|||
Эксперт Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 10 Всего: 45 |
Гм. Значит, разбирает только до уровня заголовка IP))) Сырой сокет, однако))) Заметил в коде недочет. Переменная length_sock должна быть правильно инициализирована перед вызовом recvfrom. -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
konshyn |
|
|||
Опытный Профиль Группа: Участник Сообщений: 295 Регистрация: 19.9.2013 Репутация: нет Всего: нет |
С одной стороны - да. Так Стивенс писал. Но я не знаю, как в стандарте. Но все работает, т.к. в эту переменную записывается длина структуры, а не считывается. А если инициализировать так, как нужно, результат не меняется -------------------- «Потому что ценность акта действия в этой стране возрастает в несколько раз». |
|||
|
||||
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Сети | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |