![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TServerSocket, как узнать IP клиента при подключении.
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]
Тут слишком много написано ерунды.