📄 synsock.pas
字号:
Result := libc.GetProtoByNumber(proto);
end;
function LSGetHostByName(name: PChar): PHostEnt;
begin
Result := libc.GetHostByName(Name);
end;
function LSGetHostByAddr(addr: Pointer; len, Struc: Integer): PHostEnt;
begin
Result := libc.GetHostByAddr(Addr, len, struc);
end;
function LSGetHostName(name: PChar; len: Integer): Integer;
begin
Result := libc.GetHostName(Name, Len);
end;
function LSShutdown(s: TSocket; how: Integer): Integer;
begin
Result := libc.Shutdown(S, How);
end;
function LSSetSockOpt(s: TSocket; level, optname: Integer; optval: PChar;
optlen: Integer): Integer;
begin
Result := libc.SetSockOpt(S, Level, OptName, OptVal, OptLen);
end;
function LSGetSockOpt(s: TSocket; level, optname: Integer; optval: PChar;
var optlen: Integer): Integer;
begin
Result := libc.getsockopt(s, level, optname, optval, cardinal(optlen));
end;
function LSSendTo(s: TSocket; var Buf; len, flags: Integer;
var addrto: TSockAddr; tolen: Integer): Integer;
begin
Result := libc.SendTo(S, Buf, Len, Flags, Addrto, Tolen);
end;
function LSSend(s: TSocket; var Buf; len, flags: Integer): Integer;
begin
Result := libc.Send(S, Buf, Len, Flags);
end;
function LSRecv(s: TSocket; var Buf; len, flags: Integer): Integer;
begin
Result := libc.Recv(S, Buf, Len, Flags);
end;
function LSRecvFrom(s: TSocket; var Buf; len, flags: Integer;
var from: TSockAddr; var fromlen: Integer): Integer;
begin
Result := libc.RecvFrom(S, Buf, Len, Flags, @from, @fromlen);
end;
function LSntohs(netshort: u_short): u_short;
begin
Result := libc.NToHS(netshort);
end;
function LSntohl(netlong: u_long): u_long;
begin
Result := libc.NToHL(netlong);
end;
function LSListen(s: TSocket; backlog: Integer): Integer;
begin
Result := libc.Listen(S, Backlog);
end;
function LSIoctlSocket(s: TSocket; cmd: DWORD; var arg: u_long): Integer;
begin
Result := libc.ioctl(s, cmd, @arg);
end;
function LSInet_ntoa(inaddr: TInAddr): PChar;
begin
Result := libc.inet_ntoa(inaddr);
end;
function LSInet_addr(cp: PChar): u_long;
begin
Result := libc.inet_addr(cp);
end;
function LShtons(hostshort: u_short): u_short;
begin
Result := libc.HToNs(HostShort);
end;
function LShtonl(hostlong: u_long): u_long;
begin
Result := libc.HToNL(HostLong);
end;
function LSGetSockName(s: TSocket; var name: TSockAddr; var namelen: Integer): Integer;
begin
Result := libc.GetSockName(S, Name, cardinal(namelen));
end;
function LSGetPeerName(s: TSocket; var name: TSockAddr; var namelen: Integer): Integer;
begin
Result := libc.GetPeerName(S, Name, cardinal(namelen));
end;
function LSConnect(s: TSocket; var name: TSockAddr; namelen: Integer): Integer;
begin
Result := libc.Connect(S, name, namelen);
end;
function LSCloseSocket(s: TSocket): Integer;
begin
Result := libc.__close(s);
end;
function LSBind(s: TSocket; var addr: TSockAddr; namelen: Integer): Integer;
begin
Result := libc.Bind(S, addr, namelen);
end;
function LSAccept(s: TSocket; addr: PSockAddr; addrlen: PInteger): TSocket;
begin
Result := libc.Accept(S, addr, psocketlength(addrlen));
end;
function LSSocketProc(af, Struc, Protocol: Integer): TSocket;
begin
Result := libc.Socket(Af, Struc, Protocol);
end;
function LSSelect(nfds: Integer; readfds, writefds, exceptfds: PFDSet;
timeout: PTimeVal): Longint;
begin
Result := libc.Select(nfds, readfds, writefds, exceptfds, timeout);
end;
{$ENDIF}
function InitSocketInterface(stack: string): Boolean;
begin
{$IFDEF LINUX}
Accept := LSAccept;
Bind := LSBind;
CloseSocket := LSCloseSocket;
Connect := LSConnect;
GetPeerName := LSGetPeerName;
GetSockName := LSGetSockName;
GetSockOpt := LSGetSockOpt;
Htonl := LShtonl;
Htons := LShtons;
Inet_Addr := LSinet_addr;
Inet_Ntoa := LSinet_ntoa;
IoctlSocket := LSioctlsocket;
Listen := LSlisten;
Ntohl := LSntohl;
Ntohs := LSntohs;
Recv := LSrecv;
RecvFrom := LSrecvfrom;
Select := LSselect;
Send := LSsend;
SendTo := LSsendto;
SetSockOpt := LSsetsockopt;
ShutDown := LSshutdown;
Socket := LSsocketProc;
GetHostByAddr := LSGetHostByAddr;
GetHostByName := LSGetHostByName;
GetProtoByName := LSGetProtoByName;
GetProtoByNumber := LSGetProtoByNumber;
GetServByName := LSGetServByName;
GetServByPort := LSGetServByPort;
GetHostName := LSGetHostName;
WSAGetLastError := LSWSAGetLastError;
WSAStartup := LSWSAStartup;
WSACleanup := LSWSACleanup;
Result := True;
{$ELSE}
{$IFDEF STATICWINSOCK}
Accept := Winsock.Accept;
Bind := Winsock.Bind;
CloseSocket := Winsock.CloseSocket;
Connect := Winsock.Connect;
GetPeerName := Winsock.GetPeerName;
GetSockName := Winsock.GetSockName;
GetSockOpt := Winsock.GetSockOpt;
Htonl := Winsock.htonl;
Htons := Winsock.htons;
Inet_Addr := Winsock.inet_addr;
Inet_Ntoa := Winsock.inet_ntoa;
IoctlSocket := Winsock.ioctlsocket;
Listen := Winsock.listen;
Ntohl := Winsock.ntohl;
Ntohs := Winsock.ntohs;
Recv := Winsock.recv;
RecvFrom := Winsock.recvfrom;
Select := Winsock.select;
Send := Winsock.send;
SendTo := Winsock.sendto;
SetSockOpt := Winsock.setsockopt;
ShutDown := Winsock.shutdown;
Socket := Winsock.socket;
GetHostByAddr := Winsock.GetHostByAddr;
GetHostByName := Winsock.GetHostByName;
GetProtoByName := Winsock.GetProtoByName;
GetProtoByNumber := Winsock.GetProtoByNumber;
GetServByName := Winsock.GetServByName;
GetServByPort := Winsock.GetServByPort;
GetHostName := Winsock.GetHostName;
WSAGetLastError := Winsock.WSAGetLastError;
WSAStartup := Winsock.WSAStartup;
WSACleanup := Winsock.WSACleanup;
Result := True;
{$ELSE}
Result := False;
if stack = '' then
stack := DLLStackName;
SynSockCS.Enter;
try
if SynSockCount = 0 then
begin
LibHandle := Windows.LoadLibrary(PChar(Stack));
if LibHandle <> 0 then
begin
Accept := Windows.GetProcAddress(LibHandle, PChar('accept'));
Bind := Windows.GetProcAddress(LibHandle, PChar('bind'));
CloseSocket := Windows.GetProcAddress(LibHandle, PChar('closesocket'));
Connect := Windows.GetProcAddress(LibHandle, PChar('connect'));
GetPeerName := Windows.GetProcAddress(LibHandle, PChar('getpeername'));
GetSockName := Windows.GetProcAddress(LibHandle, PChar('getsockname'));
GetSockOpt := Windows.GetProcAddress(LibHandle, PChar('getsockopt'));
Htonl := Windows.GetProcAddress(LibHandle, PChar('htonl'));
Htons := Windows.GetProcAddress(LibHandle, PChar('htons'));
Inet_Addr := Windows.GetProcAddress(LibHandle, PChar('inet_addr'));
Inet_Ntoa := Windows.GetProcAddress(LibHandle, PChar('inet_ntoa'));
IoctlSocket := Windows.GetProcAddress(LibHandle, PChar('ioctlsocket'));
Listen := Windows.GetProcAddress(LibHandle, PChar('listen'));
Ntohl := Windows.GetProcAddress(LibHandle, PChar('ntohl'));
Ntohs := Windows.GetProcAddress(LibHandle, PChar('ntohs'));
Recv := Windows.GetProcAddress(LibHandle, PChar('recv'));
RecvFrom := Windows.GetProcAddress(LibHandle, PChar('recvfrom'));
Select := Windows.GetProcAddress(LibHandle, PChar('select'));
Send := Windows.GetProcAddress(LibHandle, PChar('send'));
SendTo := Windows.GetProcAddress(LibHandle, PChar('sendto'));
SetSockOpt := Windows.GetProcAddress(LibHandle, PChar('setsockopt'));
ShutDown := Windows.GetProcAddress(LibHandle, PChar('shutdown'));
Socket := Windows.GetProcAddress(LibHandle, PChar('socket'));
GetHostByAddr := Windows.GetProcAddress(LibHandle, PChar('gethostbyaddr'));
GetHostByName := Windows.GetProcAddress(LibHandle, PChar('gethostbyname'));
GetProtoByName := Windows.GetProcAddress(LibHandle, PChar('getprotobyname'));
GetProtoByNumber := Windows.GetProcAddress(LibHandle, PChar('getprotobynumber'));
GetServByName := Windows.GetProcAddress(LibHandle, PChar('getservbyname'));
GetServByPort := Windows.GetProcAddress(LibHandle, PChar('getservbyport'));
GetHostName := Windows.GetProcAddress(LibHandle, PChar('gethostname'));
WSAGetLastError := Windows.GetProcAddress(LibHandle, PChar('WSAGetLastError'));
WSAStartup := Windows.GetProcAddress(LibHandle, PChar('WSAStartup'));
WSACleanup := Windows.GetProcAddress(LibHandle, PChar('WSACleanup'));
Result := True;
end;
end
else Result := True;
if Result then
Inc(SynSockCount);
finally
SynSockCS.Leave;
end;
{$ENDIF}
{$ENDIF}
end;
function DestroySocketInterface: Boolean;
begin
{$IFDEF LINUX}
{$ELSE}
{$IFNDEF STATICWINSOCK}
SynSockCS.Enter;
try
Dec(SynSockCount);
if SynSockCount < 0 then
SynSockCount := 0;
if SynSockCount = 0 then
if LibHandle <> 0 then
begin
Windows.FreeLibrary(libHandle);
LibHandle := 0;
end;
finally
SynSockCS.Leave;
end;
{$ENDIF}
{$ENDIF}
Result := True;
end;
{$IFNDEF LINUX}
{$IFNDEF STATICWINSOCK}
initialization
begin
SynSockCS:= TCriticalSection.Create;
end;
finalization
begin
SynSockCS.Free;
end;
{$ENDIF}
{$ENDIF}
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -