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

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

TServerSocket, как узнать IP клиента при подключении.


Страницы:   1 2 3 4 5 6

ZV ©   (2010-09-09 18:21:00) 

Хочу в событии ServerSocketClientConnectопределить адрес подключившегося клиента
Сверить его с базой разрешенных IP и если его там нет то отключить
Я так понимаю что для этого надо использовать  функции
ServerSocket.Socket.Connections[].RemonteAddress;
ServerSocket.Socket.Connections[].Close;
Но не пойму как . По идеи в событии ServerSocketClientConnect  я должен узнать  номер подключения  а  уже по номеру подключения  при помощи ServerSocket.Socket.Connections[].RemonteAddress; определить IP.
И ещё мне не понятно какому типу  переменной присваивать значение функции ServerSocket.Socket.Connections[].RemonteAddress;  ведь IP адрес имеет такой формат 172.17.200.2; ?


Anatoly Podgoretsky   (2010-09-14 15:38:00) [61]


> А что мешает двум совершенно разным клиентам подключиться
> к твоему серверу под одним и тем же IP-адресом ?

Особенно из-за НАТ


Сергей М.   (2010-09-14 15:38:00) [62]

А где у тебя обработчик OnClientError ?


Anatoly Podgoretsky   (2010-09-14 15:37:00) [63]

> ZV  (14.09.2010 15:13:51)  [51]

ИП недостаточно, подключений может быть много.


ZV   (2010-09-14 15:30:00) [64]


> Сергей М

Понял.

Сейчас вроде как все понятно. Но есть одна кака с которой я не знаю как бороться . У клиента есть такая особенность как неожиданный разрыв соединения без всяких уведомлений и потом повторное подключение, естественно у меня на сервер возникает ошибка и сервер падает. И эта кака не куда не денется,  по этому с ней нужно как то бороться. Я так понимаю что нужно сделать процедуру обработчик ошибки сокета
procedure TForm1.KaKa(Sender: TObject; Error: Exception);
begin
 If (Error.ClassName = 'ESocketError') then
   Begin
    // Что написать при обрыве связи с клиентом и повторном его подключении  я не пойму
   end
 else Application.ShowException(Error);  
end;


Сергей М.   (2010-09-14 15:18:00) [65]


> А порт на кой нужен?


А что мешает двум совершенно разным клиентам подключиться к твоему серверу под одним и тем же IP-адресом ?
Ничто)


ZV   (2010-09-14 15:13:00) [66]

А порт на кой нужен? IP не достаточно?


Сергей М.   (2010-09-14 15:07:00) [67]

Ну а где в этом "приближительно" сравнение порта ?


ZV   (2010-09-14 14:56:00) [68]


> Сергей М


> если он может измениться в любой момент времени ?

Я вник в суть проблемы

Значит я должен сделать приблизительно так ?


for i:=0 to ServerSocket1.Socket.ActiveConnections do
a:=ServerSocket1.Socket.Connections[i].RemoteAddress ;
for d:=1 to MaxClient do
if a=Client[d].IP then
begine
if Client[d].Status=false then
begin
ServerSocket1.Socket.Connections[i].Close ;
end
end


Palladin   (2010-09-14 14:34:00) [69]

"... да и цикл удаления из списка у него с единицы начинался" (С)


Сергей М.   (2010-09-14 14:11:00) [70]

Ты-то запомнил клиента С в момент его подключения под индексом 2, а после отключения клиента В клиент С вовсе не третий (по порядку) в этом списке

)


Сергей М.   (2010-09-14 14:09:00) [71]


> нужно этого пользователя от сервера отключить. И тут возникает
> вопрос - как? . Я знаю только IP


Не только. Еще и порт знаешь.
Вот эта комбинация IP-адреса и порта как раз и есть уникальный идентификатор клиента в списке активных клиентов сервера.
Остается в цикле пробежаться по всем активным соединениям в списке ActiveConnections, сравнить каждое соединение на совпадение удал. адреса и порта с искоммой комбинацией. Нафих нужен номер акт.клиента в этом списке, если он может измениться в любой момент времени ?

Ты пораскинь мозгами-то - вот, к примеру, последовательно подключились три клиента А, В и С. В списке ActiveConnections они фигурируют под индексами 0,1 и 2 соответственно. Теперь клиент В отключился. Вопрос на засыпку: каков теперь индекс соединения клиента С в этом списке ?


ZV   (2010-09-14 14:03:00) [72]


> NomberConnection:=ServerSocket1.Socket.ActiveConnections


Скорей всего это фигня. Это может работать только если клиенты будут отключаться в такой же последовательности как и подключались.
Мда, хрень


ZV   (2010-09-14 13:57:00) [73]

У активных пользователей есть определенное  время нахождения на сервере. После тог как время истекло мне нужно этого пользователя от сервера отключить. И тут возникает вопрос - как? . Я знаю только IP  а не номер его подключения. А отключить я могу конкретного клиента только через ServerSocket.Socket.Connections[f].Close

Где f и есть номер подключения.
Поэтому я и хочу при коннекте клиента к серверу узнать номер его подключения и занести его  в запись о данных клиента клиенте. И когда его время истекает я обращаюсь к записи нахожу его номер подключения и отключаю


Anatoly Podgoretsky   (2010-09-14 13:56:00) [74]


> За каким тебе понадобилось лезть в список активных соединений-
> то ?)

Он нехочет слушать этот совет


Сергей М.   (2010-09-14 13:48:00) [75]


> ZV ©   (14.09.10 12:20) [41]


Накой шиш тебе этот "номер" ?

У тебя возникло событие OnClientConnect, фактическим параметром его обработчика тебе передан объект Socket, у него есть св-во RemoteAddress (и RemoteAddr - не суть как важно). Т.е. в момент обработки события ты знаешь адрес удаленного клиента. Ну так и отключай его, если нужно, впрямо в этом же обработчике вызовом Socket.Close ! За каким тебе понадобилось лезть в список активных соединений-то ?)


ZV   (2010-09-14 12:20:00) [76]

Пока мне не ответили на вопрос я сделал так. При коннекте клиента  в поле клиента о номере подключения записываю  
NomberConnection:=ServerSocket1.Socket.ActiveConnections
И вроде  получаю номер подключения. Как то просто получилось. Может я что то упустил из виду?


ZV   (2010-09-13 23:20:00) [77]

Спасибо всем за советы.  Я все таки сделал определение всего IP а не последней цифры , преобразовать в цифровой  формат  Socket.RemoteAddress; у меня не получилось  по этому создал массив IP адресов в текстовом формате и сравниваю. В принципе работает меня пока устраивает , но возникла  новая проблема. В обработчике ServerSocket1ClientConnect   я определи IP клиента , выяснил, что клиенту доступ закрыт, теперь мне нужно его отключить через ServerSocket.Socket.Connections[?].Close . А   как я его отключу? Я знаю только его  IP но не номер его подключения. Как узнать какой номер подключения ?


Anatoly Podgoretsky   (2010-09-09 23:20:00) [78]

> ZV  (09.09.2010 23:08:38)  [38]

Ладно не хочешь ExtractFileExt, то тогда LastDelimiter + Copy


ZV   (2010-09-09 23:08:00) [79]

А воз и нынче там, вот это жесть. 3 часа прошло а как извлечь значения из Socket.RemoteAddress; так и не ясно


Anatoly Podgoretsky   (2010-09-09 22:50:00) [80]

> ZV  (09.09.2010 22:27:33)  [33]

Тут слишком много написано ерунды.


Страницы:   1 2 3 4 5 6

Наверх

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