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