Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как лучше сделать [D5]


Страницы:   1 2

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 для активных соединений, столько и "очередей" независимых будет


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо