Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Изменить UDP-заголовок руками в сокете?  (Прочитано 18783 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Артем
Опытный

nz
Offline Offline
Пол: Мужской
Beware the wolf in sheep's clothing.


« : 24-02-2005 13:29 » 

 Добрый день/вечер.

 Прога посылает UDP-пакеты. Раньше они формировались "руками" (без использования ВинСокет), и, исторически так сложилось, что в поле  "Порт источника" UDP-заголовка заноситься совсем другая инфа (а вовсе не порт источника Круто!).
 Теперь мне этот же пакет надо сформировать сокетом (WSASocket, bind  и все такое Улыбаюсь). Но вот, что то я никак не найду как записать нужное мне значение в в поле  "Порт источника" UDP-заголовка Не понял и можно ли до этого поля "достучаться" в сокетах?
 

Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 24-02-2005 15:42 » 

struct sockaddr_in sa;
sa.sin_family=AF_INET;
sa.in_addr.sin_addr=htonl(0x00000000); // любой локальный ip
sa.sin_port=htons(1234); // номер порта
bind(sock,(struct sockaddr*)&sa,sizeof(sa));

Если порт не занят другим приложением, то должно работать.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Артем
Опытный

nz
Offline Offline
Пол: Мужской
Beware the wolf in sheep's clothing.


« Ответ #2 : 24-02-2005 20:30 » 

sa.sin_port=htons(1234); // номер порта

 это, по-моему,  порт "куда шлем", т.е. поле "Порт назначения" (поправьте, если не прав), а я имею ввиду поле "Порт источника", т.е. "откуда шлем" ....
 
 
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 24-02-2005 20:48 » 

Нет. вind() назначает локальный порт. Порт назначения можно установить через sendto() или connect() (возможно что второй вариант в винде не сработает).
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Артем
Опытный

nz
Offline Offline
Пол: Мужской
Beware the wolf in sheep's clothing.


« Ответ #4 : 25-02-2005 10:53 » 

 Спасибо,  RXL!
 
 все правильно, вind() действительно назначает локальный порт, проверил и даже работает!

а я сегодня болею, торможу и все такое...
пора домой ... Жаль
Записан
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 25-02-2005 13:19 » 

Для меня новость, что bind позволил привязать адрес, которого нет на узле. Надо будет проверить на других осях, не Windows.
Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 25-02-2005 19:41 » 

npak, ты надеюсь не о 0.0.0.0? Ага
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Артем
Опытный

nz
Offline Offline
Пол: Мужской
Beware the wolf in sheep's clothing.


« Ответ #7 : 26-02-2005 09:02 » 

у меня не получилось
привязать адрес, которого нет на узле.
(правда я пытался привязать толко 255.255.255.255 Улыбаюсь )
 
 IP-пришлось писать свой, но мне другой и не надо было Улыбаюсь.

Мне нужно было "привязать"  порт источника, что успешно и удалось сделать!!!
« Последнее редактирование: 26-02-2005 14:32 от Артем » Записан
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 28-02-2005 09:06 » 

Пардон, торможу.

Да, для установки поля "Порт источника" действительно надо привязать сокет к любому из локальных адресов, а ещё лучше к 0.0.0.0 что бы не возиться с выбором подходящего адреса.

При такой реализации не все значения порта источника доступны.  В частности, если порт, соответствующий данным, занят другим приложением, то твоему приложению не удастся привязать сокет к этому порту.
Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
Артем
Опытный

nz
Offline Offline
Пол: Мужской
Beware the wolf in sheep's clothing.


« Ответ #9 : 02-03-2005 13:23 » 

Может немного странный вопрос, но все же:

 Как гарантировать что я данный порт ВСЕГДА будет свободным для того чтобы назначить его как "порт источника"?

Немного поясню вопрос.
 1. Это надо гарантировать на данном конкретном компьютере (под Win2000), сейчас у меня полный доступ к нему, но через пару месяцев он уйдет, и мне будет до него не добраться...
 2. номера портов: 1,2,3 и 4. Вот что я про них нашел:
            1=TCP-MUX - TCP Port Service Multiplexer
            2=COMPRESSNET - Management Utility
            3=COMPRESSNET - Compression Process
            4=про него ничего не нашел Жаль

Дело в том, что я не очень силен в администрировании и слабо представляю ситуацию, при которой эти порты могут быть заняты...

Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #10 : 02-03-2005 20:21 » 

npak, кстати в Linux-е можно сделать bind() к чужому адресу, если поставить галочку в /proc. Я, правда, до исследования этого вопроса не добрался. Если будешь проверять - скажи результат.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #11 : 03-03-2005 07:33 » 

Артём,
НИКАК

Но с высокой вероятностью порты с номерами больше 10 000 будут свободны.

Я обычно для экспериментов выбираю порты от 20000 и ещё ни разу не сталкивался с проблемами.

RXL, у меня сейчас нет Linux, поэтому проверить найденную тобой фичу я не могу.
Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
Артем
Опытный

nz
Offline Offline
Пол: Мужской
Beware the wolf in sheep's clothing.


« Ответ #12 : 05-03-2005 16:46 » 

npak, почему "НИКАК"?
а если "снести" с компа (и запретить в дальнейшем устанавливать) всё что может занять данные порты? Или, как вариант, оставить на компе только те приложения, которые гарантировано не займут эти порты.


Спрошу иначе:
 
  Что мне снести из системы (Win2000),  и что мне запретить пользователю устанавливать на данный комп, что бы порты с 1 по 8, были свободны (причем свободны как "порт источника")?
Записан
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #13 : 07-03-2005 05:27 » 

посмотри c:/WINDOWS/system32/drivers/etc/servics
В этом файле указаны стандартные сетевые сервисы и их привязки к портам.  На моей машине в указанном тобой диапазоне есть только сервис echo (udp echo server)
Я провёл небольшой эксперимент по проверке доступности портов.  На моей Windows XP все порты с 1 до 8 свободны.
Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #14 : 07-03-2005 07:34 » 

npak, конечно - это ж все unix-сервисы тестового назначения. Использование их на windows-машине весьма сомнительно.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #15 : 07-03-2005 09:41 » 

RXL,

это стандартные привязки сетевых сервисов к портам и не зависят от операционной системы.
Другое дело, что реализации этих сервисов присутствуют, как правило, только на юниксах,и , следовательно, на windows эти порты свободны.
Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
Артем
Опытный

nz
Offline Offline
Пол: Мужской
Beware the wolf in sheep's clothing.


« Ответ #16 : 07-03-2005 22:05 » 

  Спасибо, за ответы Улыбаюсь
У меня эти порты тоже свободны и вроде все работает Улыбаюсь

Единственное, на всякий случай, когда комп отдавать буду скажу, чтоб не ставили приложения которые занимают порты с 1 по 8
Записан
maa
Участник

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #17 : 16-05-2005 11:02 » new

Если нужный тебе порт занят, его всё же можно использовать, если установить опцию SO_REUSEADDR с помощью setsockopt().
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines