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

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

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


« : 13-06-2006 06:06 » 

Дано: VS.net - C++
Есть две проги клиент/сервер. Конектятся через И-нет по TCP/IP. Регулярно сталкиваюсь с тем что выбранный для связи порт занят. Клиентское приложение об этом узнает из ошибки сокета. А как об этом сообщить серверному приложению, чтобы оно сменило порт для связи.   С ума сойти...
« Последнее редактирование: 13-06-2006 09:43 от Mike_I » Записан

Nothing fails like success.
RXL
Технический
Администратор

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

WWW
« Ответ #1 : 13-06-2006 06:14 » 

Mike_I, клиенту укажи порт 0 - система сама назначит ему свободный. То же самое с адресом - система разберется на основе маршрутной информации по адресу сервера.
Это не относится к broadcast, multicast и raw сокетам.
« Последнее редактирование: 13-06-2006 06:17 от RXL » Записан

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

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


« Ответ #2 : 13-06-2006 06:20 » 

Ну а серверу что назначить. Там ведь тоже идет прослушивание определенного порта.
Записан

Nothing fails like success.
RXL
Технический
Администратор

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

WWW
« Ответ #3 : 13-06-2006 06:44 » 

Серверу ты должен назначить порт сам, а то клиент не будет знать, куда подсоединиться. Чтобы не было конфликтов с портами, которые система динамически назначает клиентам, используй диапазон 4001...32767 (для клиентов обычно используются диапазон 1024..4000 и различные диапазоны >32767). Конечно, это не даст 100% гарантии, что этот порт не знанят другой программой...
Записан

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

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


« Ответ #4 : 13-06-2006 06:51 » 

А как проверить на стороне сервера используется ли порт который я пытаюсь назначить или еще нет?
Записан

Nothing fails like success.
Mike_I
Участник

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


« Ответ #5 : 13-06-2006 09:45 » 

>>  клиенту укажи порт 0 - система сама назначит ему свободный.

Как она вообще может назначить ему свободный если она не знает к какой проге он пытается приконектится. Ну назначит система свободный а сервер его не слушает и что дальше...Не понял
Записан

Nothing fails like success.
RXL
Технический
Администратор

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

WWW
« Ответ #6 : 13-06-2006 09:47 » new

По тому, что скажет bind(). Ругнется - значит не можешь.
Записан

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

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

WWW
« Ответ #7 : 13-06-2006 09:48 » 

Mike_I, 0 - это о клиентском порте, а не о серверном! Серверный ты должен обязательно задать: и на сервере (bind()) и на клиенте (connect() или sendto()).
Записан

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

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


« Ответ #8 : 13-06-2006 09:52 » 

Ну допустим задал я серверный 1055  а клиентский 0 так ведь не определит же винда автоматом что сервер для этой пргои ждет связи по 1055.
Записан

Nothing fails like success.
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #9 : 13-06-2006 13:10 » 

Mike_I, Серверная часть назначает правила. Ты сказал, что сервер принимает все пакеты на порт 1055. Значит клиент должен на этот именно порт отправлять пакеты. Обратный порт клиента Будет выбран системой по умолчанию.

Например: Почти все HTTP сервера работают с портом 80. Хочеш на клиенте получать вэб страници, ты должен устанавливать связь и отправлять запросы именно на этот порт сервера. 
« Последнее редактирование: 13-06-2006 13:14 от Finch » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Михалыч
Команда клуба

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

« Ответ #10 : 13-06-2006 15:40 » 

Дано: VS.net - C++
Есть две проги клиент/сервер. Конектятся через И-нет по TCP/IP. Регулярно сталкиваюсь с тем что выбранный для связи порт занят. Клиентское приложение об этом узнает из ошибки сокета. А как об этом сообщить серверному приложению, чтобы оно сменило порт для связи.   С ума сойти...
Если я правильно понял - то считается, что занят порт со стороны сервера? Т.е. соединиться с ним вообще невозможно? Может ты пытаешся использовать порт, который уже занят? Используй диапазон свободных портов - тебе RXL уже указал на это. Серверная сторона - самопальная? Сервер однопоточный? Сколько клиентов одновременно он способен обработать? Может, если он однопоточный, так к нему второй клиент и не подключится, пока сервер предыдущего не удовлетворит, и не освободится Улыбаюсь  Правильно сделаный сервер не должен (по идее) быть занят, если конечно он не перегружен "по-уши". А идея смены порта для связи на серверной стороне  мне кажется несколько странной...
А вообще - почитай-ка теорию, для начала. Есть вот тут https://club.shelek.ru/view.php?id=29
Вот отличная книга, поищи, точно была в сети - Й. Снейдер ЭФФЕКТИВНОЕ ПРОГРАММИРОВАНИЕ TCP/IP. БИБЛИОТЕКА ПРОГРАММИСТА. В ней уйма готовых примеров, а главное рассмотрены очень многие ошибки и заблуждения Улыбаюсь
Вот ссылка, не знаю, работает еще, или нет http://www.internet-technologies.ru/books/page_1/book_103.html?results
« Последнее редактирование: 14-06-2006 01:20 от Михалыч » Записан

Поживем - увидим... Доживем - узнаем... Выживу - учту  Улыбаюсь
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines