Форум: "Сети";
Текущий архив: 2002.04.25;
Скачать: [xml.tar.bz2];
ВнизКак лучше сделать Найти похожие ветки
← →
Eraser (2002-02-12 13:01) [0]Такая задача: есть много клиентов (около 10) данные от них идут через сокет. Как мне поступить для каждого клиента выделить свой ServerSocket или можно все через один??
И еще вопрос : у нас есть такая штука MBE-RAS(сервер Удаленного доступа для выделенных линий) так вот если я рву (физически) телефонный кабель который идет к RAS"у -ни клиет ни сервер не видять что связь потяряна и работают как прежде ???
← →
Ghost. (2002-02-12 13:05) [1]Можно все через один...но ты толком обьясни, что тебе сделать надо и куда они через этот сокет идут?
← →
Eraser (2002-02-12 13:58) [2]несколько приложений у которых стоит ClientSoCket соединяются с серверной программой и шлют данные в ServerSocket котый стоит в другой программе,которая находится на компе в офисной сетке клиенты присоединены к RAS через модемы и затем идет выход в офисную сеть. Скорость RAS 19600 бод, объем данных нормальный.
Так вопрос сделать как лучше: 1 ClientSocket- 1 ServerSocket или
<<много>> ClientSocket- 1 ServerSocket???
← →
Ghost. (2002-02-12 14:17) [3]Че их плодить-то тогда тебе придется открывать для каждого свой порт..представляешь сколько ты их наоткрываешь..конечно один сервер и много клиетров..тока для этих целей лучше взять ICS (мнение субьективно) они надежнее и в примерах есть очень хорошие мультипоточные серверы
← →
Digitman (M) (2002-02-12 14:36) [4]>Eraser
На то он и TServerSocket, чтобы обслуживать более чем одного клиента "одновременно". Делай выводы.
← →
Eraser (2002-02-12 16:21) [5]ну а допустим если сразу придет инеформация от 5 клиентов он сам все это в очередь поместит корректно ??
И мне лучше для каждого клиента создать поток или прием вести поочередно??
← →
Ghost. (2002-02-12 16:30) [6]Если ты никого не слушеаешь зачем тогда эти вопросы тебе уже все обьяснили..все будет корректно
← →
Digitman (M) (2002-02-13 08:25) [7]>Eraser
Об организации клиентской очереди сообщений заботится не TServerSocket, а само гнездо, созданное ядром Winsock при успешном коннекте с клиентом. TServerSocket же всего лишь инкапсулирует ф-ции управления несколькими такими гнездами (по числу активных соединений + 1), конфигурируя их для работы в блок./неблок. режимах, опрашивая их состояния, читая их буферы приема и записывая в буферы их передачи. Так что - сколько объектов TServerClientWinSocket создал управляющий объект TServerSocket для активных соединений, столько и "очередей" независимых будет
← →
Eraser (2002-02-13 11:39) [8]сокеты коннектяться произвольно. Есть такая штука (прочитал) ServerSocket.Connectios[0].Data - типа туда записываются все данные о конкретном соединении (т.е. можно идентифицировать клиента) но подробной информации как работать с этой штукой никде нет только в 2-х словах. Не подскажете где м.б.??
И вообще может не стоит так извращаться а просто сразу после коннекта от клиента посылать какую нибудь комбинацию цифр говорящих о его принадлежности??
← →
Ghost. (2002-02-13 11:42) [9]Слушай не морочь себе голову есть хороший набор омпонентов ICS там есть очень понятные примеры мультипоточных серверов
← →
Digitman (M) (2002-02-13 12:35) [10]>>"сокеты коннектяться произвольно"
Абсолютно неверно.
>>ServerSocket.Connectios[0].Data - типа туда записываются все
>>данные о конкретном соединении
TCustomWinSocket.Data - просто указатель. Никакого отношения к гнезду как объекту ОС не имеет. Устанавливать значение этого указателя ты волен сам, как тебе вздумается. TCustomWinSocket никак на это не реагирует и ни на что в TCustomWinSocket это не влияет.
Вообще непонятно, о какого рода идентификации клиента ты говоришь. Поясни, что по-твоему сервер "должен узнать" о клиенте, установившем (пытающемся установить) соединение с сервером
← →
Eraser (2002-02-13 14:44) [11]Почему неверно >>"сокеты коннектяться произвольно"??
Какому раньше сказали Open тот первым и будет в Connections[0], и так по порядку. И тут также пришел человек раньше включил комп - он и будет первым(точнее нулевым).
А про Data я погорячился -туда можно просто складывать информацию уже после коннекта какую-хошь!!!
Но все равно ведь в принципе я могу сразу туда положить допустим переданный идентификатор от конкретного компа?? Вот только не до конца понимаю как??
← →
Digitman (M) (2002-02-13 15:08) [12]>>Почему неверно >>"сокеты коннектяться произвольно"??
Потому что сия фраза может быть истолкована как угодно ! Например : "сокет взял - и сам по себе законнектился куда-то там"
А ты, оказывается, имел ввиду порядок регистрации новых активных соединений объектом TServerSocket...
Так вот сразу после таковой регистрации объект TServerSocket возбуждает событие OnClientConnect, обработав которое ты можешь узнать как минимум : IP-адрес клиента, HostName клиента, Port клиента. Все это доступно через св-ва объекта класса TCustomWinSocket, создаваемого для нового соединения с клиентом, и ссылка на который передается параметром Socket в процедуру-обработчик события TServerSocket.OnClientConnect :
type TSocketNotifyEvent = procedure (Sender: TObject; Socket: TCustomWinSocket) of object;
А теперь скажи - тебе недостаточно этой информации ? Твой сервер еще что-то хочет знать о клиенте, кроме указанного ?
← →
Eraser (2002-02-14 10:02) [13]Спасибо это все понял и сделал, но теперь возникла проблема.
Если теряется связь(физически) с конкретным клиентом (определенное время нет от него данных), причем сервер не выпадает в ошибку (я об этом писал выше), и затем этот же клиент пытается коннектится снова то выходит ошибка API или он коннектиться на Connections[<<последний законектившийся>>+1] а тот Connections на котором он был раньше остается занятым. Помогает только Close , а затем Open для всего ServerSocket. Можно ли убить конретный коннект не ServerSocket?? Или как-то может по-другому?? Ну допустим если делать через поток то сервер увидить что поток прервался между ним и клиентом при разрыве связи ??
← →
Digitman (M) (2002-02-14 10:49) [14]для корректной отработки ситуации с физ.обрывом клиента/сервера существует , к примеру, механизм KeepAlive.
Его суть : клиент и сервер через заданные промежутки времени шлют друг-другу некую служебную инф-цию, которую принимающая сторона интерпретирует как периодическое извещение от партнера по коннекту о том, что он "жив" и активен. В случае неполучения вовремя такой "метки жизни", ожидающая ее сторона должна попросту разорвать недостоверный коннект по своей инициативе, выполнив тот же Close, к примеру
← →
Eraser (2002-02-14 10:57) [15]ну я так и делаю, но если я делаю Close серверу то рвутся все подключения а не только тот которого нет. кАк оборвать именно то от которого нет ответа
← →
Digitman (M) (2002-02-14 11:33) [16]А зачем же ты всему серверу Close делаешь ? У тебя есть список Connections[], так вот только нужным его элементам (TServerClientWinSocket) и давай команду Close
← →
Eraser (2002-02-14 11:47) [17]т.е. я должен сделать Connections[i].Close, и оборвется ш соединение??
← →
Digitman (M) (2002-02-14 12:08) [18]да. при Connections[i].Close закрывается соединение сервера с клиентом, ставшим для сервера i-тым в момент успешного коннекта с этим клиентом
← →
Eraser (2002-02-14 14:18) [19]спасибо большое
← →
Eraser (2002-02-14 14:37) [20]еще вопрос в догонку: после того как я Connections[i].Close данное i соединение будет доступно?? Я попробовал его потом Open. Написали что неверный набор параметров.
← →
Digitman (M) (2002-02-14 15:07) [21]С кем, позволь полюбопытствовать, Connections[i].Open ? С клиентом ? Где ты видел, чтобы сервер милостиво просил клиента о связи с ним ?)
← →
Eraser (2002-02-14 16:32) [22]ну да вникнув понял что неправ. но вопрос то не в этом будет ли снова на i коннект или при каждом разрыве и снова при связи i будет увеличиваться на 1??
← →
Vitaly (2002-02-14 16:41) [23]Класс!
← →
Ghost. (2002-02-14 16:47) [24]Не будет оно увеличиваться, а будет по числу реальных коннектов
← →
Digitman (M) (2002-02-14 16:57) [25]i - это просто индекс в элементе массива объектов TServerClientWinSocket. ты когда-нибудь все же сподобишься в Scktcomp.pas заглянуть или нет ?
← →
Digitman (M) (2002-02-14 17:04) [26]Тьфу ты, заговорился вже) ... индекс элемента в массиве объектов !
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2002.04.25;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.007 c