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

Вниз

проблемы с TServerSocket   Найти похожие ветки 

 
BoxTer   (2004-09-10 08:23) [0]

Доброе время суток. У меня возникла такая ситуация. Прога, рассылающая по таймеру куче клиентов некую строку кодом:
 try
  for i := 0 to ServerSocket1.Socket.ActiveConnections-1 do
       ServerSocket1.Socket.Connections[i].SendText(st);
 except
   on E: Exception do Begin
     Memo1.Lines.Add(DateTimeToStr(now)+" "+InttoStr(E.HelpContext)+", "+E.Message);
   exit;
   end;
 end;

в обработчике ошибок ServerSocket1ClientError

 Memo1.Lines.Add(DateTimeToStr(now)+" - Ошибка "+Inttostr(ErrorCode));
 if ErrorCode=10054 then Begin
     Socket.Disconnect(0);
     ErrorCode:=0;
 end;
уnd;

вываливает ошибку 10054. В MSDN глянул - там все понятно, неудачно отключается клиент. Все клиентские проги обновить просто не смогу - их множество. Даже не смотря на обнуление ошибки, сервер через некоторое время останавливается.
Причем, E.Message выдает "Вышел за пределы границ(-1)"...
Как мне справиться с этим на сервере?


 
BoxTer   (2004-09-10 08:24) [1]

и убирание строки из обработчика ошибок Socket.Disconnect(0); на работу никак не влияет...


 
BoxTer   (2004-09-10 09:01) [2]

E.Message выдает "Вышел за пределы границ(-1)" после каждой отправки на клиентов... т.е. на отправке except вываливается каждый раз после негоего неудачного отключения юзера...


 
Digitman ©   (2004-09-10 09:27) [3]

а E.ClassName что говорит ?


 
Verg ©   (2004-09-10 10:28) [4]

Socket.Disconnect(0);

Что за ноль?

Socket.Close;


 
BoxTer   (2004-09-10 11:45) [5]

2DigitMan: грит 0
2Verg: пробовал, не помогает!


 
Digitman ©   (2004-09-10 12:13) [6]


> грит 0


чего-чего ? какой такой еще "ноль" ?
любому исключению в Делфи соответствует конкретный вполне определенный класс, имя которого я у тебя и пытаюсь выведать ..

E.Message ты прочитал ? ну точно так же и в том же месте прочитай E.ClassName ! Это - важная инф-ция .. поважней, пожалуй, чем E.Message ...
а "Вышел за пределы границ(-1)" мне пока ни о чем не говорит


 
NAlexey ©   (2004-09-13 10:18) [7]

>BoxTer   (10.09.04 08:23)  
Я бы предположил что во время работы цикла меняется количество активных подключений. Попробуй поместить его в критическую секцию.


 
BoxTer   (2004-09-13 11:52) [8]

2DigitMan: EStringListError - причем тут это? ниче не понимаю!
2NAlexey: дык там и стоит try...


 
Digitman ©   (2004-09-13 12:14) [9]


> EStringListError - причем тут это?


где-то в своей программе ты обращаешься к объекту класса TStringList к элементу, индекс которого выходит за пределы диапазона 0..StringList.Count - 1


 
BoxTer   (2004-09-13 12:38) [10]

да я в курсе... но в том-то и пирог, что нету такого!
И самое парадоксальное, шо этот класс ошибки вываливается в конструкции:
try
 for i := 0 to ServerSocket1.Socket.ActiveConnections-1 do
      ServerSocket1.Socket.Connections[i].SendText(st);
except
  on E: Exception do Begin
    Memo1.Lines.Add(DateTimeToStr(now)+" "+InttoStr(E.ClassName)+", "+E.Message);
  exit;
  end;
end;


 
VMcL ©   (2004-09-13 12:44) [11]

>InttoStr(E.ClassName)

Это еще что за бред?


 
Digitman ©   (2004-09-13 12:45) [12]


> BoxTer   (13.09.04 12:38) [10]


не знаю ...
при попытке обращения за пределы диапазона индексов списка Connections[] должно возбуждаться искл-е EListError, а не EStringListError .. ибо FConnections - это TList


 
Digitman ©   (2004-09-13 12:49) [13]


> BoxTer


да, действительно ...
см.
> VMcL ©   (13.09.04 12:44) [11]


горбатого лепишь ? код в [10] даже скомпилирован не мог быть, а уж о ран-тайм там и речи вообще не идет ...


 
Verg ©   (2004-09-13 12:54) [14]

Приведи все же код обработчиков событий
OnClientError и OnClientDisconnect;


 
BoxTer   (2004-09-13 13:15) [15]

2VMcL: пардон, я вставлял прям с форума - изменил, да не все :( В проге намана все!

OnClientError:
Memo1.Lines.Add(DateTimeToStr(now)+" - Ошибка "+Inttostr(ErrorCode));
     ErrorCode:=0;


OnClientDisconnect
 Memo1.Lines.Add(DateTimeToStr(now)+" - Отключился: "+Socket.RemoteHost+" c "+Socket.RemoteAddress+";");


 
Verg ©   (2004-09-13 13:39) [16]

ServerSocket1.ServerType = ?


 
BoxTer   (2004-09-13 14:55) [17]

stNonBlocking


 
Digitman ©   (2004-09-13 15:08) [18]

for i := ServerSocket1.Socket.ActiveConnections-1 downto 0 do
 try
   ServerSocket1.Socket.Connections[i].SendText(st);
 except
 end;


 
Verg ©   (2004-09-13 16:37) [19]


> [17] BoxTer   (13.09.04 14:55)
> stNonBlocking


Ну чудеса, да и только. :)
При ошибке на передаче происходит вызов Disconnect у такого сокета. Но собственно free у него вызывается отложенно (DeferFree). Тем не менее, в твоем случае дело каким-то образом доходит все же до реального Free у сокета в пределах цикла.
Либо ты что-то недопоказываешь нам, считая, что ошибки там быть не может точно, либо грабли вообще совершенно в другом месте, либо что-то путаешь.


 
BoxTer   (2004-09-14 10:29) [20]

Нет, выложил все шо есть!


 
Verg ©   (2004-09-14 10:39) [21]

Все - это когда от begin-а до end-а, а не

> OnClientError:
> Memo1.Lines.Add(DateTimeToStr(now)+" - Ошибка "+Inttostr(ErrorCode));
>      ErrorCode:=0;
>
> OnClientDisconnect
>  Memo1.Lines.Add(DateTimeToStr(now)+" - Отключился: "+Socket.RemoteHost+"
> c "+Socket.RemoteAddress+";");


 
BoxTer   (2004-09-14 12:03) [22]

2Verg... ну добавь мысленно ;) их


 
Digitman ©   (2004-09-14 12:18) [23]


> либо грабли вообще совершенно в другом месте


да они и есть в другом месте !

ума не приложу, в каком месте кода scktcomp.pas можно обнаружить строчку raise EStringListError.Create либо прямую или косвенныю ссылку на объект TStringList, который способен сгенерировать это исключение


 
les ©   (2004-10-18 12:28) [24]

Ошибка 11004 в сокете что это



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

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

Наверх




Память: 0.5 MB
Время: 0.039 c
14-1102870382
alex145
2004-12-12 19:53
2005.01.02
Предыдущая страница


4-1100753605
Progh
2004-11-18 07:53
2005.01.02
Клик по заголовку окна


1-1103279056
Дмитрий В. Белькевич
2004-12-17 13:24
2005.01.02
Чем ловить Mem Leak и выход за границы массивов под Delphi 7.0?


14-1103087651
antonn
2004-12-15 08:14
2005.01.02
мой препод ваще опух


3-1102318930
Lamer_Of_Delphi
2004-12-06 10:42
2005.01.02
MSSQL Временные таблицы...





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