Hello Arno,

Thanks for your attention once again! I have no idea why the THttpConnection 
ConnectionDataSent uses Shutdown(1) instead of Close(). We just inherited 
the code from there. I think this is something Francois can answer.

Best Regards,

SZ

----- Original Message ----- 
From: "Arno Garrels" <[EMAIL PROTECTED]>
To: "ICS support mailing" <twsocket@elists.org>
Sent: Wednesday, March 14, 2007 5:22 PM
Subject: Re: [twsocket] Bug in MT THttpConnection close logic


> One question, why don't you call THttpMTConnection.Close?
> TCustomWSocket.InternalClose calls ShutDown(1) and subsequently
> close the socket handle as well as triggers SessionClosed
> as needed. So far I had no problems with calling Close given
> all data has been sent before (that is calling it from event
> DataSent).
>
> --
> Arno Garrels [TeamICS]
> http://www.overbyte.be/eng/overbyte/teamics.html
>
>
> Fastream Technologies wrote:
>> Hello,
>>
>> I have a modified THttpServer called THttpMTServer. In thic
>> component, there are worker threads which are pooled and connection
>> objects (THttpMTConnection) which are also pooled. I have the
>> following code called
>>> from ConnectionDataSent:
>>
>> void __fastcall httpServerClientClass::ConnectionDataSent(TObject
>> *Sender, WORD Error)
>> {
>>  if(!FDocStream)
>>   return;
>>
>>  if(DataSent >= DataToBeSent || Error)
>>  {
>>   this->Error = Error;
>>
>>   endOfResponse();
>>
>>   return;
>>  }
>>
>> ...
>>
>> Now in endOfResponse():
>>
>> void __fastcall httpServerClientClass::endOfResponse(void)
>> {
>>  if(CGIISAPIInAction)
>>  {
>>   scheduledToDestroy = true;
>>   return;
>>  }
>>
>>  if(responseEnded)
>>   return;
>>
>>  responseEnded = true;
>> ...
>>
>> if(FSessionClosedFlag)
>>  {
>>   if(pendingHeaderAvailable && availableDataBufferLen <= 2)
>>   {
>>    pendingHeaderAvailable = false;
>>    availableDataBufferLen = 0;
>>    availableDataBuffer.SetLength(0);
>>   }
>>  }
>>  else if(!KeepAlive || Error)
>>   Shutdown(1);
>>  }
>>
>> Also in OnClientDisconnected:
>>
>> void __fastcall httpServerThread::HTTPServerClientDisconnected(TObject
>> *Sender, TObject *Client, WORD Error)
>> {
>>  httpServerClientClass *clientObject = (httpServerClientClass*)Client;
>>
>> ...
>>
>>  clientObject->Error = Error;
>>
>>  clientObject->endOfResponse();
>>  clientObject->beginDetach();
>> }
>> //--------------------------------------------------------------------
>> ------- 
>>
>> and in beginDetach():
>>
>> void __fastcall httpServerClientClass::beginDetach(void)
>> {
>>  if(CGIISAPIInAction)
>>  {
>>   scheduledToDestroy = true;
>>   return;
>>  }
>>
>>  if(!detachBegan)
>>  {
>>   detachBegan = true;
>>
>>   while(!PostThreadMessage(affinityThread->ThreadID,
>> WM_HTTP_CLIENT_THREAD_DETACH, (WPARAM)this, 0))
>>    ::Sleep(1);
>>  }
>> }
>> //--------------------------------------------------------------------
>> ------- 
>>
>> For some reason sometimes with slow/WAN connections, when clients are
>> remote, this code does not work and the client object is "hung",
>> eventually filling the maximum number of connections. I have a strong
>> feeling that under some circumstances, the OnClientDisconnected is
>> not being called. Or maybe there is something else wrong. (BTW, the
>> flags such as detachBegan are correctly reset after each
>> THREAD_ATTACH.)
>>
>> BR,
>>
>> Gorkem
> -- 
> 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