|
Тема
|
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 |
|
свършва количеството на буферите, но не виждам къде ги заемам и как мога да ги освобождавам.
| |
|
|
|
|