Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.07.06;
Скачать: CL | DM;

Вниз

TServerSocket и несколько подключений   Найти похожие ветки 

 
Балбес   (2007-08-07 22:09) [0]

Жили были SocketServer и два SpcketClientа в асинхронном режиме >_<. К ServerSocket.Socket.Connections[0] и Connections[1] подключено два пользователя: первый и второй. Если отключится второй и снова подключится то все будет хорошо, первый останется в Connections[0], второй соотв-но попадет в Connections[1]. Но если отключится первый (второй перемещается в Connections[0]?) и снова подключится, то по логике второй должен быть в Connections[0] а первый (последний подключившийся) в Connections[1]. НО! Connections[0] и Connections[1] указывают оба на последнего подключившегося, т.е. на первого. Такое может быть? Проблема в сокетах или в моей голове? :)


 
Сергей М. ©   (2007-08-08 08:14) [1]


> если отключится первый (второй перемещается в Connections[0]?
> ) и снова подключится, то по логике второй должен быть в
> Connections[0] а первый (последний подключившийся) в Connections[1]


Да, именно так.


> НО! Connections[0] и Connections[1] указывают оба на последнего
> подключившегося, т.е. на первого. Такое может быть?


Нет, не может.


> Проблема в сокетах или в моей голове?


Где угодно, только не в сокетах.


 
Сергей М. ©   (2007-08-08 08:57) [2]

И вообще - идентифицировать кл.соединения по их индексу в упомянутом списке не есть разумное решение.

Уникальность клиента вполне обеспечивается комбинацией RemoteAddress:RemotePort.


 
Балбес   (2007-08-08 11:34) [3]


> Уникальность клиента вполне обеспечивается комбинацией RemoteAddress:
> RemotePort.

Не всегда. Несколько клиентов могут быть подключены с одного IP (например, когда они из LAN с выходом в интернет) или даже с одного компьютера. Другое дело, давать ли одинаковым IP подключаться.

А дело все было в коде ^_^


 
Сергей М. ©   (2007-08-08 11:38) [4]


> Не всегда


Всегда.


> например, когда они из LAN с выходом в интернет


Порты обязательно будут разные.


 
Сергей М. ©   (2007-08-08 11:39) [5]


> или даже с одного компьютера


Тот же случай - порты будут разные.


 
r.o.o.t ©   (2007-08-09 12:52) [6]

Удалено модератором
Примечание: Жаргон выключи плз...


 
ViToTiV ©   (2007-09-13 10:48) [7]

Так как всётаки однозначно определить нужного клиента? Если допустим 1000 подключений к ServerSocket, как найти нужного? Получается нужно перебрать вссе коннекты поиском по IP? Типа:
for i:=1 to ServerSocket.ActiveConnection-1 do
 if ServerSocket.Conection[i].RemoteAddres=<IP> then <нашли нужного>

А проще никак?


 
Сергей М. ©   (2007-09-13 11:56) [8]


> А проще никак?


Можно и проще.
Но для этого нужно все-таки определиться, по каким признакам должна осуществляться идентификация и откуда (и при каких условиях и в кааом виде) серверу будет поступать инф-ция для поиска и идентификации.


 
ViToTiV ©   (2007-09-13 13:00) [9]


> нужно все-таки определиться, по каким признакам должна осуществляться
> идентификация

Так вот про это я и спрашивал, как будет сделать проще? По какому признаку? Запоминать при коннекте клиента его Handle, IP, Port, Host, SocketHandle или ёще что-нибудь? И как потом обратиться сразу к нужному сокету?


 
Сергей М. ©   (2007-09-13 13:04) [10]

ты не ответил на вопрос - откуда (и при каких условиях и в кааом виде) серверу будет поступать инф-ция для поиска и идентификации .. Для выбора конкретного решения следует плясать именно от этого ..


 
ViToTiV ©   (2007-09-13 15:23) [11]

Обычная ситуаци: есть сервер, есть много клиентов, которые просто подключаются к серверу и сидят подлкюченными. Вот я и спрашиваю, какие именно свойства клиента сохранить (есть даже база SQL), что бы сервер в любое время мог послать сообщение определённому клиенту?


 
Сергей М. ©   (2007-09-13 15:29) [12]

Откуда, при каких условиях и в каком виде сервер получает информацию о необходимости послать сообщение такому-то клиенту ?


 
Сергей М. ©   (2007-09-13 15:38) [13]

Т.е. кто есть, в твоем понимании, "такой-то" клиент ?

1. i-й клиент в списке Connections ?

2. Клиент с такой-то комбинацией адрес:порт ?

3. Клиент с таким-то хэндлом сокета ?

4. Клиент с таким-то адресом объекта TCustomWinSocket ?

5. Клиент с таким-то уникальным "ником", ассоциированным тем или иным способом с конкретным уникальным коннектом в списке Connections ?

6. Еще черт-те что и сбоку бантик ?


 
ViToTiV ©   (2007-09-13 15:38) [14]

Ну допустим что идон из клиентов дал комманду серверу послать сообщение другому клиенту, или же в базе данных произошли какие-нить зменения, и об этом надо уведомить определённого пользователя.
Вообщем это что-то наподобии ICQ


 
Сергей М. ©   (2007-09-13 15:40) [15]


> ViToTiV ©   (13.09.07 15:38) [14]


см. [13]


 
ViToTiV ©   (2007-09-13 15:50) [16]


> 5. Клиент с таким-то уникальным "ником", ассоциированным
> тем или иным способом с конкретным уникальным коннектом
> в списке Connections ?

Именно вот это! Вот меня и интересует вот этот "тот или иной способ" :)
Как проще всего знать сокет, для которого я хочу послать сообщение? Ведь если я просто запомню номер коннекта, то при отключении первых коннектов, все остальные коннекты смещаются, а мне нужно быть уверенным, что сервер посылает сообщение именно тому клиенту, которому нужно. Вот поэтому я и начал разговор про то, что серверу придётся всё время пробегать по всем коннектам, и смареть, тот это клиент (по IP, handly или ещё как) или нет?


 
Сергей М. ©   (2007-09-13 16:05) [17]


> ViToTiV ©   (13.09.07 15:50) [16]


1. При коннекте создаешь некую структурированную запись, ассоциирующую ник с адресом соотв.объекта TCustomWinSocket. После проверки на уникальность ника добавляешь эту запись в свой собственный список, после чего сортируешь этот список в порядке возрастания или убывания ников, фигурирующих в записях списка, по требуемому тебе алфавитному порядку.

2. При дисконнекте ищешь в этом списке запись со ссылкой на соотв.объект TCustomWinSocket и удаляешь ее из списка.

3. При необходимости что-то послать клиенту с таким-то ником ищешь соотв.запись в своем списке и берешь из нее соотв.объект TCustomWinSocket.


 
Сергей М. ©   (2007-09-13 16:07) [18]

Иными словами, если тебя зильно заботит скорость обслуживания твоим сервером твоих клиентов, веди собственный сортированный список своих клиентов и пгользуй алгоритмы поиска в отсортированном списке.


 
ViToTiV ©   (2007-09-13 16:15) [19]


> При необходимости что-то послать клиенту с таким-то ником
> ищешь соотв.запись в своем списке

Т.е. мне всё равно придётся искать по списку? Тогда какая разница, пройдусь ли я по всем ActiveConnection сервера и проверю RemoteAddres, или же я пройдусь по своему списку и натам его ник?

Ну это в принципе понятно, просто я думал что можно по проще как-то, как например по UDP, указал ip и вперёд...


 
Сергей М. ©   (2007-09-13 16:36) [20]


> Т.е. мне всё равно придётся искать по списку?


Конечно)
Но поиск в сортированном списке в твоем случае гораздо эффективней, нежели в несортированном.


> Тогда какая разница, пройдусь ли я по всем ActiveConnection
> сервера и проверю RemoteAddres


Какой нафих RemoteAddres, если ты поставил условие поиск коннекта по нику ?)


> как например по UDP, указал ip и вперёд


А причем тут UDP ?

Он, этот ip, с луны что ли свалится ?)

В любом случае нужен некий список, ассоциирующий некий прикладной идентификатор пользователя (например, уникальный ник) с его уникальными IP-координатами в сети или с объектом, ассоциированным с этими координатами.

Такой список в TServerSocket есть (Connections), но он не сортирован и сортировки не подразумевает изначально, потому и поиск в нем при большом числе клиентов будет неэффективен. Так что если тебя заботит именно эффективность, ты так или иначе будешь вынужден прибегнуть к организации своего собственного списка, "заточенного" под эффективность операций поиска в нем нужных записей.


 
ViToTiV ©   (2007-09-13 16:44) [21]


> Какой нафих RemoteAddres, если ты поставил условие поиск
> коннекта по нику ?)

Ну так а что мне мешает хранить в и ник и айпи и имя компа и т.д.?
Вообщем, спасибо, как я думал, так всё и оказалось :)


 
Сергей М. ©   (2007-09-13 16:58) [22]


> что мне мешает хранить в и ник и айпи и имя компа


А начерта дублировать информацию ?

Сетевые координаты коннекта хранит сам объект TCustomWinSocket, тебя они не волнуют в принципе, ибо все что от тебя требуется - имея конкретный ник быстро найти этот объект и вызвать его send-метод.


 
hero ©   (2007-09-16 02:39) [23]

:))))))))))



Страницы: 1 вся ветка

Текущий архив: 2008.07.06;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.019 c
15-1211271685
kla$1
2008-05-20 12:21
2008.07.06
Microsoft SQL Server 2000


15-1211459612
matt
2008-05-22 16:33
2008.07.06
Даунгрейд с Windows Vista


2-1213013711
sydenis
2008-06-09 16:15
2008.07.06
как узнать сообщение


2-1212774296
DJ_UZer
2008-06-06 21:44
2008.07.06
При наведении файла на форму - открытие


2-1212657135
atomAltera
2008-06-05 13:12
2008.07.06
Самопроизвольная прокрутка в редакторе.