📄 ssdotnet.pas
字号:
end;
end;
end;
function Send(s: TSocket; Buf: TMemory; len, flags: Integer): Integer;
//function Send(s: TSocket; const Buf; len, flags: Integer): Integer;
begin
NullErr;
try
result := s.Send(Buf, len, SocketFlags(flags));
except
on e: System.Net.Sockets.SocketException do
begin
GetErrCode(e);
Result := integer(SOCKET_ERROR);
end;
end;
end;
function Recv(s: TSocket; Buf: TMemory; len, flags: Integer): Integer;
//function Recv(s: TSocket; var Buf; len, flags: Integer): Integer;
begin
NullErr;
try
result := s.Receive(Buf, len, SocketFlags(flags));
except
on e: System.Net.Sockets.SocketException do
begin
GetErrCode(e);
Result := integer(SOCKET_ERROR);
end;
end;
end;
//function RecvFrom(s: TSocket; var Buf; len, flags: Integer; from: PSockAddr;
// var fromlen: Integer): Integer;
function RecvFrom(s: TSocket; Buf: TMemory; len, flags: Integer; var from: TVarSin): Integer;
//function RecvFrom(s: TSocket; var Buf; len, flags: Integer; from: TVarSin): Integer;
var
EP: EndPoint;
begin
NullErr;
try
EP := from;
result := s.ReceiveFrom(Buf, len, SocketFlags(flags), EndPoint(EP));
from := EP as IPEndPoint;
except
on e: System.Net.Sockets.SocketException do
begin
GetErrCode(e);
Result := integer(SOCKET_ERROR);
end;
end;
end;
function ntohs(netshort: u_short): u_short;
begin
Result := IPAddress.NetworkToHostOrder(NetShort);
end;
function ntohl(netlong: u_long): u_long;
begin
Result := IPAddress.NetworkToHostOrder(NetLong);
end;
function Listen(s: TSocket; backlog: Integer): Integer;
begin
Result := 0;
NullErr;
try
s.Listen(backlog);
except
on e: System.Net.Sockets.SocketException do
begin
GetErrCode(e);
Result := integer(SOCKET_ERROR);
end;
end;
end;
function IoctlSocket(s: TSocket; cmd: DWORD; var arg: integer): Integer;
var
inv, outv: TMemory;
begin
Result := 0;
NullErr;
try
if cmd = DWORD(FIONBIO) then
s.Blocking := arg = 0
else
begin
inv := BitConverter.GetBytes(arg);
outv := BitConverter.GetBytes(integer(0));
s.IOControl(cmd, inv, outv);
arg := BitConverter.ToInt32(outv, 0);
end;
except
on e: System.Net.Sockets.SocketException do
begin
GetErrCode(e);
Result := integer(SOCKET_ERROR);
end;
end;
end;
function htons(hostshort: u_short): u_short;
begin
Result := IPAddress.HostToNetworkOrder(Hostshort);
end;
function htonl(hostlong: u_long): u_long;
begin
Result := IPAddress.HostToNetworkOrder(HostLong);
end;
//function GetSockName(s: TSocket; name: PSockAddr; var namelen: Integer): Integer;
function GetSockName(s: TSocket; var name: TVarSin): Integer;
begin
Result := 0;
NullErr;
try
Name := s.localEndPoint as IPEndpoint;
except
on e: System.Net.Sockets.SocketException do
begin
GetErrCode(e);
Result := integer(SOCKET_ERROR);
end;
end;
end;
//function GetPeerName(s: TSocket; name: PSockAddr; var namelen: Integer): Integer;
function GetPeerName(s: TSocket; var name: TVarSin): Integer;
begin
Result := 0;
NullErr;
try
Name := s.RemoteEndPoint as IPEndpoint;
except
on e: System.Net.Sockets.SocketException do
begin
GetErrCode(e);
Result := integer(SOCKET_ERROR);
end;
end;
end;
//function Connect(s: TSocket; name: PSockAddr; namelen: Integer): Integer;
function Connect(s: TSocket; const name: TVarSin): Integer;
begin
Result := 0;
NullErr;
try
s.Connect(name);
except
on e: System.Net.Sockets.SocketException do
begin
GetErrCode(e);
Result := integer(SOCKET_ERROR);
end;
end;
end;
function CloseSocket(s: TSocket): Integer;
begin
Result := 0;
NullErr;
try
s.Close;
except
on e: System.Net.Sockets.SocketException do
begin
Result := integer(SOCKET_ERROR);
end;
end;
end;
//function Bind(s: TSocket; addr: PSockAddr; namelen: Integer): Integer;
function Bind(s: TSocket; const addr: TVarSin): Integer;
begin
Result := 0;
NullErr;
try
s.Bind(addr);
except
on e: System.Net.Sockets.SocketException do
begin
GetErrCode(e);
Result := integer(SOCKET_ERROR);
end;
end;
end;
//function Accept(s: TSocket; addr: PSockAddr; var addrlen: Integer): TSocket;
function Accept(s: TSocket; var addr: TVarSin): TSocket;
begin
NullErr;
try
result := s.Accept();
except
on e: System.Net.Sockets.SocketException do
begin
GetErrCode(e);
Result := nil;
end;
end;
end;
function Socket(af, Struc, Protocol: Integer): TSocket;
begin
NullErr;
try
result := TSocket.Create(AddressFamily(af), SocketType(Struc), ProtocolType(Protocol));
except
on e: System.Net.Sockets.SocketException do
begin
GetErrCode(e);
Result := nil;
end;
end;
end;
{=============================================================================}
function GetPortService(value: string): integer;
var
n: integer;
begin
Result := 0;
value := Lowercase(value);
for n := 0 to High(Services) do
if services[n, 0] = value then
begin
Result := strtointdef(services[n, 1], 0);
break;
end;
if Result = 0 then
Result := StrToIntDef(value, 0);
end;
{=============================================================================}
function IsNewApi(Family: TAddrFamily): Boolean;
begin
Result := true;
end;
function SetVarSin(var Sin: TVarSin; IP, Port: string; Family: TAddrFamily; SockProtocol, SockType: integer; PreferIP4: Boolean): integer;
var
IPs: array of IPAddress;
n: integer;
ip4, ip6: string;
sip: string;
begin
sip := '';
ip4 := '';
ip6 := '';
IPs := Dns.Resolve(IP).AddressList;
for n :=low(IPs) to high(IPs) do begin
if (ip4 = '') and (IPs[n].AddressFamily = AF_INET) then
ip4 := IPs[n].toString;
if (ip6 = '') and (IPs[n].AddressFamily = AF_INET6) then
ip6 := IPs[n].toString;
if (ip4 <> '') and (ip6 <> '') then
break;
end;
case Family of
AF_UNSPEC:
begin
if (ip4 <> '') and (ip6 <> '') then
begin
if PreferIP4 then
sip := ip4
else
Sip := ip6;
end
else
begin
sip := ip4;
if (ip6 <> '') then
sip := ip6;
end;
end;
AF_INET:
sip := ip4;
AF_INET6:
sip := ip6;
end;
sin := TVarSin.Create(IPAddress.Parse(sip), GetPortService(Port));
end;
function GetSinIP(Sin: TVarSin): string;
begin
Result := Sin.Address.ToString;
end;
function GetSinPort(Sin: TVarSin): Integer;
begin
Result := Sin.Port;
end;
procedure ResolveNameToIP(Name: string; Family: TAddrFamily; SockProtocol, SockType: integer; const IPList: TStrings);
var
IPs :array of IPAddress;
n: integer;
begin
IPList.Clear;
IPs := Dns.Resolve(Name).AddressList;
for n := low(IPs) to high(IPs) do
begin
if not(((Family = AF_INET6) and (IPs[n].AddressFamily = AF_INET))
or ((Family = AF_INET) and (IPs[n].AddressFamily = AF_INET6))) then
begin
IPList.Add(IPs[n].toString);
end;
end;
end;
function ResolvePort(Port: string; Family: TAddrFamily; SockProtocol, SockType: integer): Word;
var
n: integer;
begin
Result := StrToIntDef(port, 0);
if Result = 0 then
begin
port := Lowercase(port);
for n := 0 to High(Services) do
if services[n, 0] = port then
begin
Result := strtointdef(services[n, 1], 0);
break;
end;
end;
end;
function ResolveIPToName(IP: string; Family: TAddrFamily; SockProtocol, SockType: integer): string;
begin
Result := Dns.GetHostByAddress(IP).HostName;
end;
{=============================================================================}
function InitSocketInterface(stack: string): Boolean;
begin
Result := True;
end;
function DestroySocketInterface: Boolean;
begin
NullErr;
Result := True;
end;
initialization
begin
SynSockCS := SyncObjs.TCriticalSection.Create;
// SET_IN6_IF_ADDR_ANY (@in6addr_any);
// SET_LOOPBACK_ADDR6 (@in6addr_loopback);
end;
finalization
begin
NullErr;
SynSockCS.Free;
end;
{$ENDIF}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -