unit chesstcputils; {$mode objfpc}{$H+} interface uses {$IFDEF MSWINDOWS} Winsock, {$ENDIF} Classes, SysUtils, Process; function ChessGetLocalIP(): string; implementation const CFormatIPMask = '%d.%d.%d.%d'; function ChessGetLocalIP(): string; var I, VAttempt: Integer; VStrTemp, VSitesToTry: TStringList; {$IFDEF UNIX} VProcess: TProcess; {$ENDIF} {$IFDEF MSWINDOWS} var VWSAData: TWSAData; VHostEnt: PHostEnt; VName: string; {$ENDIF} begin Result := ''; {$IFDEF UNIX} VStrTemp := TStringList.Create; VProcess := TProcess.Create(nil); try VProcess.CommandLine := 'sh -c "ifconfig eth0 | awk ''/inet end/ {print $3}''"'; VProcess.Options := [poWaitOnExit, poUsePipes]; VProcess.Execute; VStrTemp.LoadFromStream(VProcess.Output); Result := Trim(VStrTemp.Text); finally VStrTemp.Free; VProcess.Free; end; {$ENDIF} {$IFDEF MSWINDOWS} {$HINTS OFF} WSAStartup(2, VWSAData); {$HINTS ON} SetLength(VName, 255); GetHostName(PChar(VName), 255); SetLength(VName, StrLen(PChar(VName))); VHostEnt := GetHostByName(PChar(VName)); with VHostEnt^ do Result := Format(CFormatIPMask, [Byte(h_addr^[0]), Byte(h_addr^[1]), Byte(h_addr^[2]), Byte(h_addr^[3])]); WSACleanup; {$ENDIF} end; end.