Клубове Дир.бг
powered by diri.bg
търси в Клубове diri.bg Разширено търсене

Вход
Име
Парола

Клубове
Dir.bg
Взаимопомощ
Горещи теми
Компютри и Интернет
Контакти
Култура и изкуство
Мнения
Наука
Политика, Свят
Спорт
Техника
Градове
Религия и мистика
Фен клубове
Хоби, Развлечения
Общества
Я, архивите са живи
Клубове Дирене Регистрация Кой е тук Въпроси Списък Купувам / Продавам 01:56 27.05.24 
Компютри и Интернет
   >> Delphi
Всички теми Следваща тема *Кратък преглед

Тема 10055: Сокети/изчерпване на буфери / Контрол?  
Автор NikB (любопитен)
Публикувано07.02.05 17:34



От клиентски сокет непрекъснато (на всяка секунда/две:) проверявам за наличие на сървърски сокет. Ако такъв няма (или не е активен) - рано или по-късно започват да излизат едни прозорци с грешка 10055 (няма буфери).
Мисля, че коректно обработвам изключенията, а и в ClientSocket1Error съм си сложил ErrorCode:=0.
Не ми се променя логиката на връзката, така, че да не търся непрекъснато сървъра и се надявам да получа съвети за отстаняване на проблема :)

-----------------------------
unit WinSock;
...
{$EXTERNALSYM WSABASEERR}
WSABASEERR = 10000;
...
{$EXTERNALSYM WSAENOBUFS}
WSAENOBUFS = (WSABASEERR+55);
...



Тема Re: 10055: Сокети/изчерпване на буфери / Контрол?нови [re: NikB]  
Автор Mixy (миксер)
Публикувано07.02.05 21:46



Не съм го ползвал, но прилича на изчерпване на някакви ресурси, след определен брой извиквания ...

Mixy


Тема Re: 10055: Сокети/изчерпване на буфери / Контрол?нови [re: NikB]  
АвторBashBabait (Нерегистриран)
Публикувано07.02.05 21:56



Първо: Моят личен съвет е да не ползваш TClientSocket/TServerSocket. Още преди време бях открил един Exception, който нямаше абсолютно никакъв начин да се прихване. Някаква абсолютна простотия, която между другото не се коригира от Borland. Не мога да се сетя до какъв извод достигнах дебъгвайки дори из сорсовете на TClientSocket, но тотално се изумих, когато установих, че прихващане на този Exception просто няма (става въпрос за asynchronous събитие което си настъпва с някакъв месидж, и преди или след да се извика хендлъра ти за обработка на събитието, не си спомням точно - то вземе че си изгърми само с един хубав прозорец за грешка). Това разбира се само при асинхронна употреба. При синхронна няма проблем но мен ме кефи първия стил.

И сега по въпроса ти: как точно проверяваш за наличие на сървърски сокет ? Т.е. проверяваш дали TClientSocket хендъла или там каквото беше е все още активен ? Как го правиш с каква функция ? Съвсем определено работиш със асинхронни сокети за да има нещо общо с буфери. Прихващаш ли събитията за отваряне и затваряне на сокета или по друг начин проверяваш ?

Един съвет за заключение - опитай се да си намериш сокет компонент, с който да свикнеш да работиш или сам си направи свой. Не разчитай за асинхронни сокети в никакъв случай на TClientSocket/TServerSocket. Дори самата им архитектура не е много мислена като че ли



Тема Май проблемът е както го описвашнови [re: BashBabait]  
Автор NikB (любопитен)
Публикувано07.02.05 23:24



Правя го прекалено сложно.
1. Началото на конектването е някакво събитие, което веднъж станало, изисква (или поне аз така си мисля:) сокетът винаги да е конектна.
2. Когато установя ClientSocket1.Active:=true, си запомням тази случка в мой флаг: fl_I := true;
3. Във обработчика на всяко от събитията:
ClientSocket1Connect
ClientSocket1Connecting
ClientSocket1Lookup
ClientSocket1Disconnect

си свалям флага fl_I
в ClientSocket1Error:
if Socket.Connected then begin
ClientSocket1.Active:=false;
end;
ErrorCode:=0;

4. По таймер, на няколко секунди проверявам и ако не съм конектант и не ми е вдигнат fl_I, отново правя опит за конектване:
if (ClientSocket1<>nil) and (ClientSocket1.Port>0) and
(not ClientSocket1.Active) and (NetStation.State<>csInitialize) then begin
ClientSocket1.Open;
NetStation.State := csInitialize;
end;

Това четвъртото създава проблемите, поради изчерпване на нещо (MemCheck и MemProof не хващат проблема), а прозорците за грешка, които се появяват са точно като това, което описваш и аз също стигнах до извода, че някъде из API нещо става и не се прихваща от приложението.


Ти може би не си очаквал да приема отговорът ти като покана за помощ, но си го позволявам заради отзивчивостта ти и заради това, че май съм попадал на един твой много симпатичен тулс (казано на кратко:).


По въпроса за смяна на технологията със сокетите - тези дни изтеглих Инди10, но още не съм го усвоил (и липсват демота, а хелпът много прилича на моята документация - лимоните са жълти плодове:).
Ти какво ползваш?



Тема Да, така изглежда, но не знам какви са :)нови [re: Mixy]  
Автор NikB (любопитен)
Публикувано08.02.05 00:54



свършва количеството на буферите, но не виждам къде ги заемам и как мога да ги освобождавам.




Всички темиСледваща тема*Кратък преглед
Клуб :  


Clubs.dir.bg е форум за дискусии. Dir.bg не носи отговорност за съдържанието и достоверността на публикуваните в дискусиите материали.

Никаква част от съдържанието на тази страница не може да бъде репродуцирана, записвана или предавана под каквато и да е форма или по какъвто и да е повод без писменото съгласие на Dir.bg
За Забележки, коментари и предложения ползвайте формата за Обратна връзка | Мобилна версия | Потребителско споразумение
© 2006-2024 Dir.bg Всички права запазени.