Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 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.004 c
1-17551
Kamazoh
2002-04-23 14:05
2002.05.06
ActiveScripting


1-17513
Billy
2002-04-21 03:36
2002.05.06
Битая Делфа


1-17582
DeMoN-777
2002-04-21 19:04
2002.05.06
Есть-ли в Delphi5 Функция sound как в Паскале ?


1-17647
SONY
2002-04-23 14:53
2002.05.06
как из кол. секунд (integer) получить время (TTime)


3-17509
Ник
2002-04-11 21:34
2002.05.06
Grid с автоматическим выравниванием ширины столбцов





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