Форум: "Сети";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 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]

Тьфу ты, заговорился вже) ... индекс элемента в массиве объектов !




Форум: "Сети";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.25;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.77 MB
Время: 0.023 c
6-81017           Arlekin17             2002-02-14 17:57  2002.04.25  
Пожалуйста объясните как работает BROADCAST.....


1-80868           kopachev              2002-04-12 10:28  2002.04.25  
Как программно менять значение Options в StringGride


6-81026           Ghost.                2002-02-12 13:12  2002.04.25  
Вопрос по DNS


3-80824           VAleksey              2002-04-05 14:29  2002.04.25  
Refresh для Oracl


4-81107           Demon[DZ]             2002-02-20 15:00  2002.04.25  
Component package