Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.05.06;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.012 c
4-17738
Косильщик_Лужаёв
2002-03-02 14:27
2002.05.06
Keyboard sniffer


14-17704
savva
2002-03-28 10:11
2002.05.06
Не знаю куда вопрос задавать, попробую здесь.


4-17746
guliver
2002-03-02 02:37
2002.05.06
Autorun


4-17729
Slider-DSP
2002-02-23 14:31
2002.05.06
Как погасить монитор?


4-17727
Rider
2002-02-28 19:39
2002.05.06
API функции для работы с мышью