Форум: "Сети";
Текущий архив: 2004.09.26;
Скачать: [xml.tar.bz2];
ВнизПроблема с TServerSocket Найти похожие ветки
← →
BoxTer (2004-07-15 06:13) [0]Доброе время суток!
У меня возникла интересная ситуевина: есть программулина, рассылающая некую строку по таймеру каждую минуту, вот код:
for i := 0 to ServerSocket1.Socket.ActiveConnections-1 do begin
ServerSocket1.Socket.Connections[i].Lock;
ServerSocket1.Socket.Connections[i].SendText(st);
ServerSocket1.Socket.Connections[i].UnLock;
end;
в некоторый момент времени на серваке вылазит мессага типа "Ошибка асинхронности сокетов 10060" и св-во ServerSocket1.Active становиться на False. Ессно, все коннекты обрываются. Не могу понять почему это происходит и как избавиться от проблемы?
з.ы. есть подозрение, что это происходит во время отключения очередного юзера - по-этому добавил lock,unlock. Но не помогает... Хееееелп :-(
← →
Григорьев Антон © (2004-07-15 08:25) [1]Для начала надо было бы найти в MSDN"е описание ошибки 10060:
A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.
Так что подозрение ваше верное.
Lock, Unlock - это из другой оперы. Непонято, с чего это вы решили, что это поможет.
Надо просто поместить SendText внутрь try/except и самому обрабатывать это исключение.
← →
BoxTer (2004-07-15 13:12) [2]дык я и обрабатываю, но в любом случае на эксепте свойство ServerSocket1.Active становиться на False и все коннекты обрубаются... Я его включаю на эксепте, юзерам приходится переподключаться...
← →
Григорьев Антон © (2004-07-15 20:28) [3]Сервер жалуется на ошибку на удалённой стороне. Я бы предположил, что сеть работает неустойчиво. Если это так, то тут ничего не сделаешь, придётся подключаться заново. Или переходить на UDP, который подключения не требует. Но тогда придётся вручную следить за порядком доставки пакетов, за тем, чтобы они не пропадали.
← →
BoxTer (2004-07-16 06:22) [4]а могет ишшо какие-нить мысли есть у кого?
← →
Digitman © (2004-07-16 08:16) [5]
> BoxTer (16.07.04 06:22) [4]
у меня есть мысль ... правда, к сабжу она не имеет непоср. отношения ..
а мысль такая - зачем тебе lock/unlock-вызовы понадобились ?
← →
BoxTer (2004-07-16 09:19) [6]2Digitman. Понял, ашипся. Вопрос в другом...
← →
Digitman © (2004-07-16 09:34) [7]
> BoxTer
покажи как ты обрабатываешь события серверного компонента
← →
Dickan (2004-07-16 09:40) [8]В Вашем примере пакеты передаются одним потоком, т.е.
отправленный пакет:= st+st+st+... и т.д.
Лоченье здесь непричём.
Со стороны клиента обязательно надо присылать серверу сообжение о получении пакета.
← →
Digitman © (2004-07-16 09:43) [9]
> Dickan (16.07.04 09:40) [8]
> Со стороны клиента обязательно надо присылать серверу сообжение
> о получении пакета
с какой это стати - "обязательно" ?
это определяется исключительно прикладным протоколом инф.обмена и к TCP/IP отношения не имеет
← →
Dickan (2004-07-16 09:48) [10]ну не обязательно ;0)
Просто обязательность определяется праильностью работы программы.
← →
Digitman © (2004-07-16 10:00) [11]
> Dickan (16.07.04 09:48) [10]
> обязательность определяется праильностью работы программы
из того что программа у автора работает "неправильно" вовсе не следует, что для достижения "правильности" ее работы требуется обязательное прикладное квитирование доставляемых сообщений
← →
BoxTer (2004-07-16 12:03) [12]2Digitman:
ни одного события на компоненте ServwerSocket1 не обрабатывается...
Просто вот таким кодом раз в минуту рассылается:try
try
for i := 0 to ServerSocket1.Socket.ActiveConnections-1 do begin
ServerSocket1.Socket.Connections[i].SendText(st);
end;
except
//messageDlg("Ошибка отправки на клиентов."+#13#10+"Всего пользователей: "+inttostr(ServerSocket1.Socket.ActiveConnections)+#13#10+sh,mtError,[mbok],0);
ServerSocket1.Active:=True;
exit;
end;
finally
MainForm.Caption:="Последняя удачная отправка: "+timetostr(now);
end;
Может что-то я не так делаю?
← →
Digitman © (2004-07-16 12:15) [13]
> ни одного события на компоненте ServwerSocket1 не обрабатывается
это печально
события OnClientWrite, OnClientError существуют не для украшения
и обрати свой взор на то, что SendText() - это функция
← →
BoxTer (2004-07-16 13:28) [14]2Digitman: а какой-нить код можешь представить... Я ServerSocket впервые юзаю...
← →
Digitman © (2004-07-16 13:32) [15]
> какой-нить код можешь представить
не могу ... любой код зависит от конечной логики
а справка - она всегда под рукой
← →
VID © (2004-07-16 17:47) [16]to BoxTer: В-общем, тебе надо обработать OnClientError таким образом что бы там была строка
ErrorCode := 0 (Это что бы сообщения об ошибке не появлялись).
Разумеется эту строку надо писать уже после того как ты используешь значение переменной ErrorCode для анализа ошибки в этом же обработчике (хотя тебе это вряд ли понадобится).
Так же не грех отправку текста взять в скобки try except end;
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2004.09.26;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.035 c