Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2010.12.12;
Скачать: [xml.tar.bz2];

Вниз

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

 
ZV ©   (2010-09-15 17:19) [80]


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

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


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 18:14) [81]

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


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

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

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


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

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


 
Anatoly Podgoretsky ©   (2010-09-15 18:50) [83]

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

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


 
ZV ©   (2010-09-15 18:54) [84]


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

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


 
Anatoly Podgoretsky ©   (2010-09-15 19:10) [85]

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

Тоже нафиг


 
ZV ©   (2010-09-20 15:30) [86]

И так, проблема с ошибкой 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, может в этом проблема ?


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


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


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


 
Anatoly Podgoretsky ©   (2010-09-20 16:26) [88]

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

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


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

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


 
ZV ©   (2010-09-20 16:52) [90]


> Я полагаю что у тебя 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:53) [91]


> Я полагаю что у тебя 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 17:09) [92]

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


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


> Да, только без приставки 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:57) [94]


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

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


 
ZV ©   (2010-09-20 18:01) [95]


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

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


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


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


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


 
ZV ©   (2010-09-20 18:32) [97]


> Это тоже можно трактовать двояко.

Короче, отключение  питания девайса (обесточивание).Но  это  сейчас не главное.

Вопрос стоит в том что делать с моей проблемой? Как устранять ошибку?


 
Anatoly Podgoretsky ©   (2010-09-20 19:29) [98]


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

А это что

> procedure TForm6.ServerSocket1ClientError(Sender: TObject;
>
>  Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var
> ErrorCode: Integer);


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


> ZV ©   (20.09.10 18:32) [97]


А скажи, любезный, эти твои дивайсы коннектятся к серверу всегда с одного и того же порта ?
Или номер порта при каждой попытке коннекта различен ?


 
ZV ©   (2010-09-20 23:08) [100]


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

Подключение всегда по одному порту,этот параметр прошит в памяти.
Со стороны девайса проблем нет, тестировал на сервере который делаю, запустили на круговой  коннект дисконнект, 20000 подключений и отключений и не одной сбойки не было . Я же выше писал что тестировал и на чужом сервере  при одновременном подключении и отключении 10 девайсов, все работает .

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

Да, такой каки я не ожидал.

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

А это что

> procedure TForm6.ServerSocket1ClientError(Sender: TObject;
>
>  Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var
> ErrorCode: Integer);

А как обработать ErrorEvent ? Я же не гуру в Delphi а только учусь.

Вы подскажите как а я сделаю что вы скажите, я сам в этой проблеме не разберусь, опыт у меня не тот что у Вас к сожалению.


 
Anatoly Podgoretsky ©   (2010-09-20 23:20) [101]

> ZV  (20.09.2010 23:08:40)  [100]

TErrorEvent описан в справке.


 
ZV ©   (2010-09-20 23:53) [102]

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


 
ZV ©   (2010-09-21 00:32) [103]


> TErrorEvent описан в справке.

Без примера я не пойму что делать с TErrorEvent . Справка на английском языке мне много не даст. Не ужели тяжело показать пример как работать с TErrorEvent ?
Вы поймите что я не так хорошо владеют Delphi как Вы , и что для Вас очевидно, для меня темный лес.


 
Anatoly Podgoretsky ©   (2010-09-21 09:37) [104]

> ZV  (21.09.2010 00:32:43)  [103]

То есть ты хочешь сказать, что ты даже основ не знаешь,
Не умеешь работать с нумероваными типами,
Тогда тебе еще рано программировать сокеты.


 
app ©   (2010-09-21 09:46) [105]

> Anatoly Podgoretsky  (21.09.2010 09:37:44)  [104]

Если прогноза не будет, то закрою ветку, нельзя же столько времени мусолить
данный вопрос, как бесперспективная тема. Максим еще 5 постов.


 
app ©   (2010-09-21 09:50) [106]

> app  (21.09.2010 09:46:45)  [105]

Прогноз такой - если прогресса ...


 
Сергей М. ©   (2010-09-21 10:47) [107]


> Подключение всегда по одному порту,этот параметр прошит
> в памяти


Что значит "по порту" ?

У сервера номер порт фиксирован, например, 12345.
А у клиента ?

Что говорит твой сервер в OnClienConnect по поводу Socket.RemotePort ?
Это порт всегда один и тот же или различен при каждом коннекте ?


 
Anatoly Podgoretsky ©   (2010-09-21 11:06) [108]

Я еще в [89] просил дать информацию по сокету и нуль, одна трепология вокруг да около.


 
Сергей М. ©   (2010-09-21 11:10) [109]


> Справка на английском языке мне много не даст


Как это не даст ? Всем дает, а тебе отказывает ?)
Плохо уговариваешь)


 
ZV ©   (2010-09-21 13:28) [110]

Прогресс есть, решил проблему таким образом в событии ServerSocket1ClientError

прописал   ErrorCode:=0;
Теперь сообщение об ошибке Socketa не появляется, сервер пока работает нормально, запустил на тест с постоянным отпаданием  клиента и повторным коннектом, уже прошло 200 обрывов, повторный коннект проходит без проблем,сервер работает стабильно

Почему  тут ни кто не написал чтобы я так сделал?
Блин одна строчка кода  и проблема исчезла  .


>
> У сервера номер порт фиксирован, например, 12345.
> А у клиента ?
>
> Что говорит твой сервер в OnClienConnect по поводу Socket.
> RemotePort ?
> Это порт всегда один и тот же или различен при каждом коннекте
> ?

Номер порта что у клиента что у сервера один и тот же, фиксированный. Порт один и тот же при каждом коннекте


 
Сергей М. ©   (2010-09-21 13:37) [111]


> Почему  тут ни кто не написал чтобы я так сделал?


А тебе тут кто-то чем-то обязан ?)


> Порт один и тот же при каждом коннекте


Ну тогда ситуация с ошибкой 10053 вполне объяснима.
А вот как только клиент будет коннектиться к твоему серверу с разных портов, вот тогда ошибку эту с учетом [82] ты никогда не увидишь. И будут битые соединения висеть мертвым грузом в списке активных, пока твой сервер активен и не использует тот или иной KeepAlive-механизм для периодического обнаружения клиентских трупов)


 
ZV ©   (2010-09-21 14:09) [112]


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

Получается что сокет будет висеть открытым , потому что клиент отвалился и не дал команду на закрытие, а сервер не в курсе что этот сокет больше не используется и нужно его закрывать. А каким образом делать проверку не используемых сокетов? Может есть какой то параметр у сокета если он не активен определенный промежуток времени то его нужно закрыть ?


 
Сергей М. ©   (2010-09-21 14:33) [113]


> ZV ©   (21.09.10 14:09) [112]


http://www.rsdn.ru/article/net/keep_alive.xml
http://www.rsdn.ru/forum/network/2553292.flat.aspx


 
ZV ©   (2010-09-21 14:38) [114]


> Сергей М

<Большое спасибо, будем разбираться.


 
ZV ©   (2010-09-21 15:49) [115]

Да KeepAlive , это жестко, есть описание или для С++ или UNIX , вот все что нашел для Delphi  http://www.delphi-forum.de/topic_Problem+beim+Nutzen+von+Socket+setsockopt+und+SOKEEPALIVE_96953,0.html но что из этого мне нужно я не пойму, подскажите , я сам не разберусь.


 
Сергей М. ©   (2010-09-21 16:31) [116]


> KeepAlive , это жестко


Ну сделай "мягко", раз сишный код для тебя новые ворота - по таймеру периодически отправляй своему клиенту какую-нибудь безобидную хрень. Если схлопочешь при  очередной отправке исключение, значит на том конце труп)

Я ж тебе об этом еще в [82] сказал)



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

Форум: "Начинающим";
Текущий архив: 2010.12.12;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.7 MB
Время: 0.008 c
6-1230923741
Deltas
2009-01-02 22:15
2010.12.12
Внутренний IP


15-1283723936
Германн
2010-09-06 01:58
2010.12.12
Иконка контроллера


15-1283256546
AlexDn
2010-08-31 16:09
2010.12.12
Поисковики и регион


15-1283856091
бумбум
2010-09-07 14:41
2010.12.12
Резервное копирование базы MS SQL 2000


15-1283342686
12
2010-09-01 16:04
2010.12.12
Скажите, а дрова на ноут от vista или 7 подойдут для XP?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский