Having looked at the OverbyteIcsWSocket unit, I've noticed many IFDEF CLR which probably might be removed.
First of all, I think it's better to turn all buffers from PAnsiChar / array of AnsiChar to TBytes, as it is recommended by Embarcadero (though one would declare this type for compilers up to BDS2006). Second, I see numerous cases of copying by for loops in CLR code, while on WIN32 it's done by Move. I also noticed System.Buffer.BlockCopy(FRcvdPtr, 0, Buffer, 0, FLineLength); in just one place instead of for loop, maybe this function should be used? Moreover, when copy from string to buffer is done, like here: procedure TCustomWSocket.PutStringInSendBuffer(const Str : RawByteString); {$IFDEF CLR} var Data : TBytes; I : Integer; begin SetLength(Data, Length(Str)); for I := 1 to Length(Str) do Data[I - 1] := Ord(Str[I]); PutDataInSendBuffer(Data, Length(Str)); {$ENDIF} why not use Str.GetBytes method? (I suppose it to be realised in .Net from the very beginning) Another places where I discovered possibly non-optimal defines: 1) {$IFDEF CLR} TSockAddr = OverbyteIcsWinSock.TSockAddr; {$ENDIF} {$IFDEF WIN32} TSockAddr = OverbyteIcsWinsock.TSockAddr; ip_mreq = record imr_multiaddr : in_addr; imr_interface : in_addr; end; {$ENDIF} => TSockAddr = OverbyteIcsWinSock.TSockAddr; {$IFDEF WIN32} ip_mreq = record imr_multiaddr : in_addr; imr_interface : in_addr; end; {$ENDIF} ? 2) function Send({$IFDEF CLR} const {$ENDIF} Data : TWSocketData; Len : Integer) : Integer; overload; virtual; and function SendTo(Dest : TSockAddr; DestLen : Integer; {$IFDEF CLR} const {$ENDIF} Data : TWSocketData; Len : Integer) : Integer; virtual; why not declare it const for all platforms? 3) in WSocket_accept there's too much conditions, even for D1 - I thought D1-D6 is unsupported in v7 ? Some other remarks: 4) function AddOptions(Opts: array of TWSocketOption): TWSocketOptions; Result := Result + [Opts[I]]; => Include(Result, Opts[I]); as it is faster 5) function RemoveOption( Result := OptSet - [Opt]; => Exclude(Result, Opt); the same 6) (possibly bug) for I := Low(LocalSockName.sin_zero) to High(LocalSockName.sin_zero) do LocalSockName.sin_zero[0] := #0; LocalSockName.sin_zero[i] ? 7) procedure TCustomSocksWSocket.SocksDoAuthenticate; TempS := AnsiString(FSocksPassword); TempS := AnsiString(FSocksUsercode); Looks like one couldn't use Unicode characters in Socks login? Is it mistake or protocol restriction? 8) Phe := PHostent(@FDnsLookupBuffer); if phe <> nil then begin Phe currently never could be nil, as FDnsLookupBuffer is declared as static array field Of course, these are just small proposals, and I probably haven't taken into account some deep relations or something else, so please don't judge me too strictly. -- Anton -- To unsubscribe or change your settings for TWSocket mailing list please goto http://lists.elists.org/cgi-bin/mailman/listinfo/twsocket Visit our website at http://www.overbyte.be