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; ?


Сергей М.   (2010-09-20 18:08:00) [21]


> перезагрузка ПО клиента


Это тоже можно трактовать двояко.
Например, нажатие кнопульки Reset на корпусе дивайса - это тоже "перезагрузка ПО клиента", которую принято называть "холодным рестартом".


ZV   (2010-09-20 18:01:00) [22]


> > Да, только без приставки Type
>
>
> Это как это ?
>

Ошибся , с приставкой


ZV   (2010-09-20 17:57:00) [23]


> Что ты называешь reset'ом ?

Полная  перезагрузка ПО клиента


Сергей М.   (2010-09-20 17:26:00) [24]


> Да, только без приставки Type


Это как это ?


> Я такого события для ServerSocket не нашел


Черным же по белому написано в справке к OnClientError :

Set the ErrorCode parameter to 0 if the OnClientError event handler successfully deals with the error condition to prevent an ESocketError from being raised.


> я делаю клиентам reset


Что ты называешь reset'ом ?

reset он разный бывает..


> ServeSocket при коннекте делает какую то сверку   по ip
> клиента который хочет подключиться  и с базой подключенных
> клиентов и  тут возникает коллизия из за повтора iP


Не делает он никаких "сверок по ip".
По кр.мере в D7.


ZV   (2010-09-20 17:09:00) [25]

Я хрен пойму эту проблему , ну отвалился клиент, остался сокет открытым, подключается заново  клиент для него создается новый сокет, я же не работаю с отвалившимся клиентом какого хрена вылетает ошибка . Или ServeSocket при коннекте делает какую то сверку   по ip клиента который хочет подключиться  и с базой подключенных клиентов и  тут возникает коллизия из за повтора iP , по ходу в обработчике ошибки нужно найти  номер коннекта клиента с таким же Ip отключить его а потом разрешить коннект  клиенту?  
Если отвалившимся  клиентам сменить IP адреса  коннект проходит без проблем.
P.S. Все настроения испортила эта ошибка, дальше делать ни чего не хочется.


ZV   (2010-09-20 16:53:00) [26]


> Я полагаю что у тебя ServerSocket1.ServerType = stNonBlocking.

Да, только без приставки Type

> Какое значение ErrorCode, не пытался ли обработать ErrorEvent
>


Код ошибкb тот же вот что написано в сообщении
rasied exception class Esocket Error with message 'Ascynchronous socket error 1053


> не пытался ли обработать ErrorEvent
>

Я такого события для ServerSocket не нашел, или я не правильно вас понял

У меня есть программка мини сервер , так вот я над ней издеваюсь , к ней подключаются  10 клиентов , затем я делаю клиентам reset и повторный коннект, и хрен какая ошибка вылетает, и так молотит каждую секунду, и ещё к этому серверу подключено 5 клиентов которые просто  висят на сервере,
Но  я заметил на этом сервере такую вещь , там выводится информация о подключении и отключении так вот когда я повторно подключаю клиентов то сервер выводит информацию от том что произошел дисконнект а затем коннект
Походу он закрывает подключения отвалившихся клиентов а затем подключает их.

Значит как то это решаемо?


ZV   (2010-09-20 16:52:00) [27]


> Я полагаю что у тебя ServerSocket1.ServerType = stNonBlocking.

Да, только без приставки Type

> Какое значение ErrorCode, не пытался ли обработать ErrorEvent
>


Код ошибкb тот же вот что написано в сообщении
rasied exception class Esocket Error with message 'Ascynchronous socket error 1053


> не пытался ли обработать ErrorEvent
>

Я такого события для ServerSocket не нашел, или я не правильно вас понял

У меня есть программка мини сервер , так вот я над ней издеваюсь , к ней подключаются  10 клиентов , затем я делаю клиентам reset и повторный коннект, и хрен какая ошибка вылетает, и так молотит каждую секунду, и ещё к этому серверу подключено 5 клиентов которые просто  висят на сервере,
Но  я заметил на этом сервере такую вещь , там выводится информация о подключении и отключении так вот когда я повторно подключаю клиентов то сервер выводит информацию от том что произошел дисконнект а затем коннект
Походу он закрывает подключения отвалившихся клиентов а затем подключает их.

Значит как то это решаемо?


Anatoly Podgoretsky   (2010-09-20 16:28:00) [28]

И в обработчикаъ подключение/отключение показать сокет.


Anatoly Podgoretsky   (2010-09-20 16:26:00) [29]

> ZV  (20.09.2010 15:30:26)  [86]

Какое значение ErrorCode, не пытался ли обработать ErrorEvent


Сергей М.   (2010-09-20 16:23:00) [30]


> ZV ©   (20.09.10 15:30) [86]


Я полагаю что у тебя ServerSocket1.ServerType = stNonBlocking.
Это соответствует действительности ?


ZV   (2010-09-20 15:30:00) [31]

И так, проблема с ошибкой soketa при повторном подключении так и не решена, это начинает уже напрягать, так как сама программа готова.
Написал элементарную программку для проверки ( как утверждал Сергей М. нужно выкинуть все лишнее из кода и ошибки не будет) ниж приведен код из которого уже выкидывать не чего  , но ошибка вылетает так как и вылетала

Вот собственно сам код

unit Unit6;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, ScktComp, StdCtrls;

type
 TForm6 = class(TForm)
   Memo1: TMemo;
   ServerSocket1: TServerSocket;
   procedure ServerSocket1ClientConnect(Sender: TObject;
    Socket: TCustomWinSocket);
   procedure ServerSocket1ClientDisconnect(Sender: TObject;
     Socket: TCustomWinSocket);
   procedure ServerSocket1ClientError(Sender: TObject;
     Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
     var ErrorCode: Integer);

 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form6: TForm6;

implementation

{$R *.dfm}

procedure TForm6.ServerSocket1ClientConnect(Sender: TObject;
 Socket: TCustomWinSocket);
begin
     Memo1.Lines.Add('['+TimeToStr(Time)+'] Клиент подключился ');
end;

procedure TForm6.ServerSocket1ClientDisconnect(Sender: TObject;
 Socket: TCustomWinSocket);
begin
     Memo1.Lines.Add('['+TimeToStr(Time)+'] Клиент отключился  ');
end;

procedure TForm6.ServerSocket1ClientError(Sender: TObject;
 Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer);
begin
       Memo1.Lines.Add('['+TimeToStr(Time)+'] ServerSocket1ClientError');
end;

end.


Вот что выводиться в поле Мемо1

[14:16:14] Клиент подключился    //клиент подключился , затем reset клиента
[14:16:19] ServerSocket1ClientError // повторное подключение клиента
[14:16:20] Клиент подключился  // игнорирование ошибки в сообщении



Коментариий Сергея М. - Еще раз повторяю - если ты не вызываешь никакие методы объекта, ассоциированного с неким ранее подключившимся клиентом, то OnSocketError для этого соединения никогда не возникнет !!!!
Ну и какие я методы вызвал в данной программе? Почему возникло ServerSocket1ClientError ?

Я так понимаю что эту ошибку победить нельзя в случе неожиданного  обрыва клиента? Пока я не увидел ни одного рационального предложения, только размышления

P.S. использую Delphi 2009, может в этом проблема ?


Anatoly Podgoretsky   (2010-09-15 19:10:00) [32]

> ZV  (15.09.2010 18:54:24)  [84]

Тоже нафиг


ZV   (2010-09-15 18:54:00) [33]


> Нафига ты переводил, нам что теперь делать обратный перевод?
>
>

В низу  топика ссылка на оригинал


Anatoly Podgoretsky   (2010-09-15 18:50:00) [34]

> ZV  (15.09.2010 17:19:20)  [80]

Нафига ты переводил, нам что теперь делать обратный перевод?


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

Черным же по белому написано в том документе, на который ты пеняешь:

WinSock functions: recv(), recvfrom(), sendto(), FD_CLOSE
Additional functions: send()


Нет вызова тех самых методов - нет и вызова этих функций.
Нет вызова этих ф-ций - нет и ошибки.
Нет ошибки - нет и исключения.

Или опять не понятно ?)


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

Да упарил ты уже своим  "сначала" да "потом")
Еще раз повторяю - если ты не вызываешь никакие методы объекта, ассоциированного с неким ранее подключившимся клиентом, то OnSocketError для этого соединения никогда не возникнет !!!!


ZV   (2010-09-15 17:19:00) [37]


> ошибку вызывает не факт подключения, а кривые действия твоего
> сервера уже после успешного подключения ?
>

Да не тут все не так, вы посмотрите внимательно на последовательность появления сообщений, сперва идет обработка ошибок а затем подключение . У меня в обработчиках ошибок ни чего кроме вывода сообщения нет.
Вот что пишут об этой ошибке (автоматический перевод с англ)


WSAECONNABORTED (10053) Программное обеспечение вызвало связи Прервать.

Беркли Описание: прервать соединение было вызвано внутренними на вашей машине. Программное обеспечение вызвало связи прервать из-за отсутствия места на очереди сокета и сокета не может принимать новые соединения.

WinSock описание: Частично же, как и Беркли. Ошибка может возникать при локальной вычислительной сети прерывает соединение. Это может произойти, если WinSock прервалось после установленного соединения ретрансляции данных не удается (получатель никогда не признает данные, передаваемые на поток данных сокета).

TCP / IP сценарий: соединение будет таймаут, если местная система не получает (ACK) nowledgement для переданных данных. Было бы также, если тайм-аут (FIN) иш пакетов TCP не ACK'd (и даже если это FIN ACK'd, в конечном счете, если тайм-аут FIN не возвращается).

Пользователь предложения: Есть несколько вещей, чтобы проверить, что может помочь определить, почему произошел сбой. В принципе, вы хотите определить, где возникла проблема.

 Пинг удаленного хоста вы были связаны. Если он не отвечает, это может быть офф-лайн или могут быть проблемы в сети на этом пути. Если это не реагировать, то эту проблему можно было бы переходных 1 (так что вы можно восстановить в настоящее время), или сервер приложений вы подключены к бы прекращено (так что вы не сможете подключиться снова).
   ) Пинг местного узла, чтобы проверить вашу локальную сеть продолжает функционировать (если на последовательный порт, см. следующий шаг)
    Если вы на последовательный порт, локальный маршрутизатор IP-адрес хоста, который первоначально вошли на с SLIP или PPP.
  Пинг хоста на той же подсети, что и хозяин вы подключены к (если вы знаете, 1). Это позволит убедиться, что сеть не функционирует.
  Попробуйте "Traceroute" принимающей вы подключены. Это не будет раскрывать слишком много, если вы не знаете адреса маршрутизатора на удаленной машине, но это может помочь определить, что проблема находится где-то в пути.

Функции: Recv () , recvfrom () , SendTo () , Fd_Close
Дополнительные функции: отправить () с CAN также WSAECONNABORTED Fail. Любая функция, как входной разъем, который принимает параметр - за исключением Закрыть сокет () - Неужели это возможно к ошибке.


оригинал здесь http://www.sockets.com/err_lst1.htm


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


> ZV ©   (15.09.10 16:41) [75]


Ты пойми одну простую вещь - OnClientError неможет возникнуть, если сервер не производит никаких операций с соединением, ассоциированным с ранее подключившимся клиентом (т.е. фигурирующим в списке Connections). К этим действиям относятся вызовы сервером любых Send- и Receive-методов, а также метода Close объекта TServerClientWinSocket, коим клиент представлен в списке Connections.


Сергей М.   (2010-09-15 16:55:00) [39]


> клиент все таки подключился


Ну наконец-то)
Теперь, полагаю, ты осознал что ошибку вызывает не факт подключения, а кривые действия твоего сервера уже послеуспешного подключения ?

Вот я тебе и предлагаю - чтобы лишний раз убедиться в этом, выкинь требуху изо всех обработчиков кроме OnClientConnect и OnClientDisconnect, оставив в них только протоколирование возникновения этих событий.
Событие OnClientError не должно возникнуть ни разу на всем протяжении времени пока сервер активен.


Anatoly Podgoretsky   (2010-09-15 16:46:00) [40]

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


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

Наверх

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