PSD
Главный специалист
Offline
Пол:
|
|
« : 27-03-2006 04:50 » |
|
В связи с тем что не нашел студенческой литературы по вопросу прошу разъяснить технологию(разговор не за конкретную реализацию а о технологии вообще)
Прочитал статью на этом сайте посвященную серверам и основным их способом реализации, много плохо понятного кода и не очень много теории. Осталась у меня одна непонятка.
Все приведенные в статье сервера работали по алгоритму, Слушающий порт, принимает коннект, выдает аксепт, принимает данные, ретранслирует их, обрывает соединение и заново открывает порт на прослушку. То есть фактически соединение создается только для передачи одного пакета.
Мне необходимо создать несколько постоянных подключений, по которым на сервер будут слаться запросы и понимже возвращаться данные. Я уже решал подобную задачу, но не имея достаточных знаний по технологии программирования сетей использовал алгоритм: Основной порт на прослушке, коннект, аксепт, отсылка клиенту номера свободного динамически выделяемого порта сервера, клиент соединяется устанавливае соединение с выделенным портом и работает по нему.
Возможно ли в принципе с точки зрения технологии WinSock поддержание нескольких постоянных соединений через один открытый порт на сервере? Как это реализовывается (интересует не столько код сколько сам алгоритм.) ?
|
|
|
Записан
|
Да да нет нет все остальное от лукавого.
|
|
|
Михалыч
|
|
« Ответ #1 : 27-03-2006 05:09 » |
|
Все приведенные в статье сервера работали по алгоритму, Слушающий порт, принимает коннект, выдает аксепт, принимает данные, ретранслирует их, обрывает соединение и заново открывает порт на прослушку. То есть фактически соединение создается только для передачи одного пакета. Да ну, это ерунда какая-то - передача одного пакета. Просто м.б. пример так написан был... На самом деле кто мешает продолжать себе использовать полученное соединение - на сокете, который вернул accept()? Обычный параллельный сервер - классический. Поищи книгу Стивенса "Эффективное программирование TCP/IP" Точно есть в сети, сам качал, на русском языке - все доходчиво и подробно, и с примерами и для винды и для юникса.
|
|
« Последнее редактирование: 27-03-2006 05:15 от Михалыч »
|
Записан
|
Поживем - увидим... Доживем - узнаем... Выживу - учту
|
|
|
Hooter
|
|
« Ответ #2 : 27-03-2006 05:10 » |
|
Основной порт на прослушке, коннект, аксепт, отсылка клиенту номера свободного динамически выделяемого порта сервера, клиент соединяется устанавливае соединение с выделенным портом и работает по нему.
Возможно ли в принципе с точки зрения технологии WinSock поддержание нескольких постоянных соединений через один открытый порт на сервере? Как это реализовывается (интересует не столько код сколько сам алгоритм.) ?
Насколько я знаю, принцип следуующий: основной порт на прослушке, коннект, аксепт (акцепт возвращает новый сокет, который будут обрабатывать новое соединение), основной порт опять на прослушке, новый сокет обрабатывает запросы клиента до разрыва соединения.
|
|
|
Записан
|
|
|
|
Михалыч
|
|
« Ответ #3 : 27-03-2006 05:16 » |
|
|
|
« Последнее редактирование: 27-03-2006 05:21 от Михалыч »
|
Записан
|
Поживем - увидим... Доживем - узнаем... Выживу - учту
|
|
|
RXL
Технический
Администратор
Online
Пол:
|
|
« Ответ #4 : 27-03-2006 05:53 » |
|
Михалыч, вообще-то книга Стивенса только по *nix. У меня есть бумажный переведенный вариант, а у нас в библиотеке лежит электронный английский вариант. Большая часть интерфейса BSD-сокетов и WinSock2 одинакова, но изменены имена некоторых фукций (closesocket напр.), разный тип ресурса (в *nix сокет - файловый дескриптор) и принципы асинхронного управления разнятся. Но такие модели, как один сокет + одно направление передачи = один поток, работают везде.
PSD, Hooter совершенно прав! Слушающий сокет при accept() создает новый сокет, соединенный с клиентом, а слушающий никуда не девается.
Передавать же адрес нового порта пользователю - извращение, подобное протоколу FTP, который разработан еще в 70-х годах.
TCP соединение имеет уникальность по сумме следующих данных: IP сервера, порт сервера, IP клиента, порт клиента. Когда ты принимаешь соединения на один серверный порт, тебя не заботят параметры клиента - он сам заботится о выборе порта для исходящих соединений.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
PSD
Главный специалист
Offline
Пол:
|
|
« Ответ #5 : 27-03-2006 06:05 » |
|
RXL , ага вот это я и хотел услышать .... получается мы даем аксепт и получаем 2 сокета, один на линии другой слушающий и соответсвенно оба могут работать паралельно.... Спасибо.
|
|
|
Записан
|
Да да нет нет все остальное от лукавого.
|
|
|
npak
|
|
« Ответ #6 : 27-03-2006 08:14 » |
|
То есть фактически соединение создается только для передачи одного пакета. Да ну, это ерунда какая-то - передача одного пакета. Так работает протокол HTTP - по умолчанию соединение создаётся для передачи одной пары запрос-ответ
|
|
|
Записан
|
|
|
|
Михалыч
|
|
« Ответ #7 : 27-03-2006 08:28 » |
|
Михалыч, вообще-то книга Стивенса только по *nix RXL, может ты о другой книге говоришь? В этой как раз примеры сделаны так, что работают и в винде и в юниксе. Сам читал и смотрел. Правда, действительно там в остновном, на 99% ориентация на юникс, и нет суровой виндовой специфики. Но теория-то она и в Африке... А в ней очень неплохо изложены, например типичные ошибки для начинающих npak - гы-ы-ы , тут я не подумал, видимо. HTTP-протокол никогда не использовал
|
|
« Последнее редактирование: 27-03-2006 08:31 от Михалыч »
|
Записан
|
Поживем - увидим... Доживем - узнаем... Выживу - учту
|
|
|
RXL
Технический
Администратор
Online
Пол:
|
|
« Ответ #8 : 27-03-2006 08:34 » |
|
Я имел в виду "TCP/IP Illustrated".
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Hooter
|
|
« Ответ #9 : 28-03-2006 05:02 » |
|
То есть фактически соединение создается только для передачи одного пакета. Да ну, это ерунда какая-то - передача одного пакета. Так работает протокол HTTP - по умолчанию соединение создаётся для передачи одной пары запрос-ответ Ну, это же не значит, что так нужно строить принцип работы любого сервера Кроме того, даже в HTTP есть параметр Keep-Alive.
|
|
|
Записан
|
|
|
|
|