Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 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.006 c
1-80881
snoup
2002-04-14 01:07
2002.04.25
Вот сегодня скачал RX Library, пожалуйста подскажите как, что,


3-80777
Sewix
2002-04-04 12:05
2002.04.25
Б Д не работает на другом компе


14-81046
lipskiy
2002-03-19 21:45
2002.04.25
По поводу XP и убитого винта - шутка дубль два или что это?


3-80776
Labert
2002-04-04 13:19
2002.04.25
TQuery.Filter не работает


1-80994
Miwa
2002-04-12 11:48
2002.04.25
TP7: Не то чтобы глюк, но все же...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский