procedure TServerObj.ServerSocketClientRead(
const Sender: TObject;
const Socket: TCustomWinSocket);
var
cbRcv: integer;
RcvBuf:
array [0..WSOCK_READ_BUFFER_SIZE * 8]
of Byte;
RcvBufItem: TRcvBufItem;
hMemData: hGlobal;
hMemStruct: hGlobal;
begin
cbRcv := Socket.ReceiveBuf(RcvBuf[0], WSOCK_READ_BUFFER_SIZE * 8);
if cbRcv <= 0
then EXIT;
if Socket.SocketHandle <= 0
then EXIT;
hMemData := GlobalAlloc(GMEM_FIXED, cbRcv);
move(RcvBuf[0], Pointer(hMemData)^, cbRcv);
hMemStruct := GlobalAlloc(GMEM_FIXED, SizeOf(TRcvBufItem));
RcvBufItem.ptrData := Pointer(hMemData);
RcvBufItem.cbData := cbRcv;
RcvBufItem.Socket := Socket.SocketHandle;
RcvBufItem.hMemStruct := hMemStruct;
RcvBufItem.hMemData := hMemData;
move(RcvBufItem, Pointer(hMemStruct)^, SizeOf(TRcvBufItem));
if FRecvBuffer.
Write(Pointer(hMemStruct), SizeOf(TRcvBufItem)) <>
SizeOf(TRcvBufItem)
then
begin
FRecvBuffer.SetBufSize((FRecvBuffer.BufSize + cbRcv) * 2);
FRecvBuffer.Remove(SizeOf(TRcvBufItem));
if FRecvBuffer.
Write(Pointer(hMemStruct), SizeOf(TRcvBufItem)) <>
SizeOf(TRcvBufItem)
then
raise exception.Create('
you should never see this');
end;
SetEvent(FMsgDispatchEvent);
end;