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

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

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

« : 27-03-2006 04:50 » 


В связи с тем что не нашел студенческой литературы по вопросу  прошу разъяснить технологию(разговор не за конкретную реализацию а о технологии вообще)

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

Все приведенные в статье сервера работали по алгоритму,
Слушающий порт, принимает коннект, выдает аксепт, принимает данные, ретранслирует их, обрывает соединение и заново открывает порт на прослушку.
То есть фактически соединение  создается только для передачи одного пакета.

Мне необходимо  создать несколько постоянных подключений, по которым на сервер будут слаться запросы и понимже возвращаться данные.  Я уже решал подобную задачу, но не имея достаточных знаний по технологии программирования сетей использовал алгоритм:
Основной порт на прослушке, коннект, аксепт,  отсылка клиенту номера свободного динамически выделяемого порта сервера, клиент соединяется устанавливае соединение с выделенным портом и работает по нему.   

Возможно ли в принципе с точки зрения  технологии WinSock поддержание нескольких постоянных соединений через один открытый порт на сервере?
 Как это реализовывается (интересует не столько код сколько сам алгоритм.)  ?

 



Записан

Да да нет нет все остальное от лукавого.
Михалыч
Команда клуба

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

« Ответ #1 : 27-03-2006 05:09 » 

Цитата
Все приведенные в статье сервера работали по алгоритму,
Слушающий порт, принимает коннект, выдает аксепт, принимает данные, ретранслирует их, обрывает соединение и заново открывает порт на прослушку.
То есть фактически соединение  создается только для передачи одного пакета.
Да ну, это ерунда какая-то - передача одного пакета. Просто м.б. пример так написан был... На самом деле кто мешает продолжать себе использовать полученное соединение - на сокете, который вернул accept()? Обычный параллельный сервер - классический. Поищи книгу Стивенса "Эффективное программирование TCP/IP" Точно есть в сети, сам качал, на русском языке - все доходчиво и подробно, и с примерами и для винды и для юникса.
« Последнее редактирование: 27-03-2006 05:15 от Михалыч » Записан

Поживем - увидим... Доживем - узнаем... Выживу - учту  Улыбаюсь
Hooter
Опытный

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

« Ответ #2 : 27-03-2006 05:10 » 

Основной порт на прослушке, коннект, аксепт,  отсылка клиенту номера свободного динамически выделяемого порта сервера, клиент соединяется устанавливае соединение с выделенным портом и работает по нему.   

Возможно ли в принципе с точки зрения  технологии WinSock поддержание нескольких постоянных соединений через один открытый порт на сервере?
 Как это реализовывается (интересует не столько код сколько сам алгоритм.)  ?

Насколько я знаю, принцип следуующий: основной порт на прослушке, коннект, аксепт (акцепт возвращает новый сокет, который будут обрабатывать новое соединение), основной порт опять на прослушке, новый сокет обрабатывает запросы клиента до разрыва соединения.
Записан
Михалыч
Команда клуба

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

« Ответ #3 : 27-03-2006 05:16 » new

Во - нашел Улыбаюсь http://www.internet-technologies.ru/books/book_103.html
На самом деле сервер совсем не обязательно должен быть параллельным Улыбаюсь Легко можно сделать и последовательный. Вот, например...
http://www.qnxclub.net/files/articles/serv_nblock/serv_nblock.pdf
http://www.qnxclub.net/files/articles/EchSrv/echsrv-107.html
« Последнее редактирование: 27-03-2006 05:21 от Михалыч » Записан

Поживем - увидим... Доживем - узнаем... Выживу - учту  Улыбаюсь
RXL
Технический
Администратор

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

WWW
« Ответ #4 : 27-03-2006 05:53 » 

Михалыч, вообще-то книга Стивенса только по *nix. У меня есть бумажный переведенный вариант, а у нас в библиотеке лежит электронный английский вариант. Большая часть интерфейса BSD-сокетов и WinSock2 одинакова, но изменены имена некоторых фукций (closesocket напр.), разный тип ресурса (в *nix сокет - файловый дескриптор) и принципы асинхронного управления разнятся. Но такие модели, как один сокет + одно направление передачи = один поток, работают везде.

PSD, Hooter совершенно прав! Слушающий сокет при accept() создает новый сокет, соединенный с клиентом, а  слушающий никуда не девается.

Передавать же адрес нового порта пользователю - извращение, подобное протоколу FTP, который разработан еще в 70-х годах.

TCP соединение имеет уникальность по сумме следующих данных: IP сервера, порт сервера, IP клиента, порт клиента.
Когда ты принимаешь соединения на один серверный порт, тебя не заботят параметры клиента - он сам заботится о выборе порта для исходящих соединений.
Записан

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

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

« Ответ #5 : 27-03-2006 06:05 » 

RXL , ага вот это я и хотел услышать .... получается мы даем аксепт и получаем 2 сокета, один на линии другой слушающий и соответсвенно оба могут работать паралельно....
Спасибо.


   

 
Записан

Да да нет нет все остальное от лукавого.
npak
Команда клуба

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

« Ответ #6 : 27-03-2006 08:14 » 

Цитата
То есть фактически соединение  создается только для передачи одного пакета.
Да ну, это ерунда какая-то - передача одного пакета.
Так работает протокол HTTP - по умолчанию соединение создаётся для передачи одной пары запрос-ответ
Записан

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

http://www.unitesk.com/ru/
Михалыч
Команда клуба

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

« Ответ #7 : 27-03-2006 08:28 » 

Цитата
Михалыч, вообще-то книга Стивенса только по *nix
RXL, может ты о другой книге говоришь? В этой как раз примеры сделаны так, что работают и в винде и в юниксе. Сам читал и смотрел. Правда, действительно там в остновном, на 99% ориентация на юникс, и нет суровой виндовой специфики. Но теория-то она и в Африке... Улыбаюсь
А в ней очень неплохо изложены, например типичные ошибки для начинающих Улыбаюсь
npak - гы-ы-ы Улыбаюсь, тут я не подумал, видимо. HTTP-протокол никогда не использовал Улыбаюсь
« Последнее редактирование: 27-03-2006 08:31 от Михалыч » Записан

Поживем - увидим... Доживем - узнаем... Выживу - учту  Улыбаюсь
RXL
Технический
Администратор

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

WWW
« Ответ #8 : 27-03-2006 08:34 » 

Я имел в виду "TCP/IP Illustrated".
Записан

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

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

« Ответ #9 : 28-03-2006 05:02 » 

Цитата
То есть фактически соединение  создается только для передачи одного пакета.
Да ну, это ерунда какая-то - передача одного пакета.
Так работает протокол HTTP - по умолчанию соединение создаётся для передачи одной пары запрос-ответ
Ну, это же не значит, что так нужно строить принцип работы любого сервера Улыбаюсь
Кроме того, даже в HTTP есть параметр Keep-Alive.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines