Fastream Technologies wrote:

>> I don't know this exception message, do you mean "List index out of
>> bounds()"?
> 
> Yes, exactly.

So most likely you hit a synchronization bug in your code, hard to
say what's wrong. Critical stuff is access to the client list,
add/remove clients and iterate. Those things need to be
protected very carefully. Only one thread may access the list
at the same time. Also reading property ClientCount is unreliable
since right after a read its value may already have changed.
Especially take care what happens when a client disconnects as
well as handle all possible exceptions inside the threads,
including component exceptions. It may help if you use a TThreadList
instead of current TList, at least it's easier to code thread-safe.

---
Arno Garrels [TeamICS]
http://www.overbyte.be/eng/overbyte/teamics.html


> 
>> 
>> According to procedure Dup, the component state does not seem to be
>> wsClosed.
>> 
>> procedure TCustomWSocket.Dup(NewHSocket : TSocket);
>> var
>>    iStatus : Integer;
>>    optlen  : Integer;
>> begin
>>    ..
>>    if FState <> wsClosed then begin
>>        iStatus := WSocket_Synchronized_closesocket(FHSocket);
>>        FHSocket := INVALID_SOCKET;
>>        if iStatus <> 0 then begin
>>            SocketError('Dup (closesocket)');
>>            Exit;
>>        end;
>> 
>>        ChangeState(wsClosed);
>>    end;
>>    FHsocket := NewHSocket;
>> ..
>> 
>> ---
>> Arno Garrels [TeamICS]
>> http://www.overbyte.be/eng/overbyte/teamics.html
>> 
>> 
>> 
>> Fastream Technologies wrote:
>>> Hello,
>>> 
>>> I have the following function called from worker thread context
>>> (NewHSocket passed with a message):
>>> 
>>> function TCustomWSocketMTServer.AfterClientCreated(
>>>     Client : TWSocketMTClient; Error: Word; NewHSocket: integer) :
>>> boolean; var
>>>     currentClientCount: integer;
>>>     currentMaxClients: integer;
>>> begin
>>>     Result := TRUE;
>>> 
>>>     FCriticalSection.Enter;
>>>     Inc(FClientNum);
>>>     Client.Name            := Name + 'Client' +
>>> IntToStr(FClientNum);     FClientList.Add(Client);
>>>     currentClientCount     := FClientList.Count;
>>>     Client.Banner          := FBanner;
>>>     Client.Server          := Self;
>>>     currentMaxClients      := FMaxClients;
>>>     FCriticalSection.Leave;
>>> 
>>>     {$IFNDEF NO_DEBUG_LOG}
>>>     Client.IcsLogger       := IcsLogger;                           {
>>> V5.04 }     {$ENDIF}
>>> 
>>>     Client.Dup(NewHSocket);  // SOMETIMES WHEN HIGH LOAD IS IN
>>> PLACE, THIS FUNCTION MAKES CLIENT.HSOCKET = -1 AND RAISES THE
>>> EXCEPTION "LIST ITEM OUT OF INDEX"
>>>     Client.OnDataSent := nil;
>>> 
>>>     TriggerClientConnect(Client, Error);
>>> 
>>>     { Ok, the client is still there, process with the connection }
>>>     if (currentMaxClients > 0) and (currentClientCount >
>>> currentMaxClients) then begin
>>>         { Sorry, too much clients }
>>>         Client.Banner := BannerTooBusy;
>>>         Client.OnDataAvailable := nil; // should be set previously
>>> in initClient for non-503
>>>         Client.StartConnection;
>>>         Client.CloseDelayed;
>>> 
>>>         Result := false;
>>>     end;
>>> end;
>>> 
>>> Any idea?
>>> 
>>> Best Regards,
>>> 
>>> SZ
>> --
>> To unsubscribe or change your settings for TWSocket mailing list
>> please goto http://www.elists.org/mailman/listinfo/twsocket
>> Visit our website at http://www.overbyte.be
-- 
To unsubscribe or change your settings for TWSocket mailing list
please goto http://www.elists.org/mailman/listinfo/twsocket
Visit our website at http://www.overbyte.be

Reply via email to