Форум: "Сети";
Текущий архив: 2002.05.06;
Скачать: [xml.tar.bz2];
ВнизWinsock Найти похожие ветки
← →
Morozik (2002-02-18 12:57) [0]Господа знатоки, помогите разобраться пожалуйста.
Есть приложение клиент-сервер Вынь 95/98. Клиенты переодически шлют серверу разную фигню. Ежели сервер долго отсутствует в сети у клиента возникает ошибка 10055(переполнение буфера). Как можно избавиться от этого. Заранее благодарен.
← →
Digitman (2002-02-18 13:24) [1]Можно. Например, перестать "пер Еодически слать серверу всякую фигню" и привести "фигню", в результате которой на клиентской стороне возникает ошибка, в виде фрагмента исх.текста (коннект, дисконнект, прием/передача "фигни", обработка ошибок)
← →
mr.Morra (2002-02-18 14:15) [2]Удалено модератором
← →
mr.Morra (2002-02-18 14:29) [3]Удалено модератором
← →
Ghost. (2002-02-18 14:49) [4]Ну вообще, что-то тут не так..у меня точно такаяже система и клиенту побарабану скоко раз пробовать..но я сейчас принцип немного поменял и теперь клиент слушает порт по UDP и как тока сервер туда написал, что он пришел сразу к нему и коннектится и причем это было сделано для того, что сервер может быть запущен сейчас на одном, а потом на другом компе и все клиенты как тока так сразу перестраиваюся а их у меня около 10 и все чудесно пашет
← →
Digitman (2002-02-18 14:52) [5]>mr.Morra
1. А ты кто такой, собственно, чтобы на уровне "лапусек" разговаривать с незнакомыми тебе людьми ? :|
2. Какое отношение ты имеешь к вопросу от <Morozik> ? У тебя есть собственный вопрос ? Задавай его в отдельной ветке !
3. Кроме метода TCustomWinSocket.SendText(..) тебе известны прочие методы этого класса ? А события ? В частности - OnError() ? Ты искал в этой конференции дискуссии, связанные с обработкой ошибок в событии OnError() ? Да попросту "зажеванный" уже вопрос !!!!
4. Коль уж ты "вклинился" так беспардонно в дискуссию и ситуация у тебя - аналогичная авторской, будь уж так любезен - вчитайся в мой ответ : где твои фрагменты исх.текста ?? Я что, на пальцах тебе объяснять буду, где у тебя что не так ???
← →
Digitman (2002-02-18 15:16) [6]>mr.Morra
Учись читать текст Борланда и вникать !
Открываем модуль scktcomp.pas, смотрим, находим искомое.
Вот он, тот метод, который ты фактически вызываешь при попытке коннекта к серверу, которому планируешь "слать фигню" :
procedure TCustomWinSocket.Open(const Name, Address, Service: string; Port: Word; Block: Boolean);
begin
if FConnected then raise ESocketError.CreateRes(@sSocketAlreadyOpen);
//вот создается гнездо как ОС-объект,
//читай - занимаем ОС-ресурс
FSocket := socket(PF_INET, SOCK_STREAM, IPPROTO_IP); //!!!
if FSocket = INVALID_SOCKET then raise ESocketError.CreateRes(@sCannotCreateSocket);
try
Event(Self, seLookUp);
if Block then
begin
FAddr := InitSocket(Name, Address, Service, Port, True);
//вот здесь происходит попытка коннекта,
//которая вызывает отказ, если сервер недоступен
DoOpen;
end else
AsyncInitSocket(Name, Address, Service, Port, 0, True);
except
//сюда мы НИКОГДА не попадем при попытке
//корректного коннекта к отсутствующему серверу !
//а здесь ведь гнездо как ОС-ресурс освобождается !!!
Disconnect(FSocket);
raise;
end;
end;
Резюме элементарно вникающего в чужой текст программера д.б. такое :
- "падение" клиента, пытающегося осуществить попытку коннекта к отсутствующему серверу просто периодически вызываемым методом Open без соответствующего Close, рано или поздно, но - неизбежно ! И именно - по причине неосвобождения ресурсов системы после каждой неудачной попытки !
Вывод, который должен сделать пытающийся самостоятельно найти решение программер :
После каждой неуспешной попытки коннекта необходимо обязательно вызывать метод Close, как минимум - для коррекции баланса занимаемых объектом ОС-ресурсов
Где это сделать наиболее корректно и удобно ? Да в том же самом обработчике OnError() ! А заодно и "обнулить" ErrorCode, чтобы по результату обработки ошибки коннекта объект не возбуждал исключение.
← →
mr.Morra (2002-02-18 15:24) [7]Удалено модератором
← →
Digitman (2002-02-18 15:51) [8]Оно мне надо - тратить время и выяснять, кто там скрывается под разными-пестрыми "морозиками" да "мыр-моррами" ?)
Но - заглянул из чистого любопытства. Ровно то, что ожидал, то и лицезрел. Сказать, что ? Дешевая, пестрящая откровенным "пацанством" самореклама в уже старомодных кислотных тонах, никакого отношения ни к тематике форума, ни к программингу вообще не имеющая. Вот мое мнение, "золотце")
← →
Morozik (2002-02-18 19:45) [9]Вот кусок кода
procedure TForm1.ClientSocket1Error(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
Label3.Caption := Label3.Caption + " - код последней ошибки "+IntToStr(ErrorCode);
ErrorCode:=0;
ClientSocket1.Close;
ClientSocket1.Open;
end;
Всё как и рекомендовано, но никак не влият в лучшую сторону :(... чё делать то?
← →
Morozik (2002-02-18 20:01) [10]Да вот ещё кусочек
procedure TForm1.Timer2Timer(Sender: TObject);
begin
try
ClientSocket1.Close;
ClientSocket1.Open;
finally
.....
end;
← →
Digitman (2002-02-19 12:33) [11]>Morozik
вызов ClientSocket1.Open в обработчике OnError() некорректен.
выноси этот вызов из обработчика ошибки в любое событие, не связанное с событиями гнезда, например, событие того же таймера :
procedure TForm1.ClientSocket1Error(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
Label3.Caption := Label3.Caption + " - код последней ошибки "+IntToStr(ErrorCode);
ErrorCode:=0;
ClientSocket1.Close;
Timer2.Enabled := True;
end;
procedure TForm1.Timer2Timer(Sender: TObject);
begin
ClientSocket1.Open;
Timer2.Enabled := False;
end;
← →
ATLANTIDO (2002-02-19 23:51) [12]2 Digitman: можно ли по цепочке исходников компонентов углубляясь
все дальше и дальше дойти до протоколов физического уровня ?
← →
Digitman (2002-02-20 08:18) [13]>ATLANTIDO
Нет. Дойдешь только до WinsockAPI
← →
BAHO (2002-02-21 05:04) [14]В принципе добратся можно хоть до машинного кода, но стоит ли это делать !?
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2002.05.06;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.006 c