8 {Redefine socaddr here, becouse original is too short for ipv6 and unix}
9 type tSockAddrL
= packed record
10 sa_family
: sa_family_t
;
11 sa_data
: array [0..107] of byte;
13 type tSockAddr
= type tSockAddrL deprecated
;
16 tFamily
=(afNil
=0, afInet
=1, afInet6
);
18 { Network-byte-ordered words }
19 Word2
=array [1..2] of byte; {0..65535}
20 Word4
=array [1..4] of byte; {0..4294967295}
22 { Object to store Socket Address }
25 function Length
:word;
26 { Returns length of the structure based on address family }
28 procedure ToSocket( var sockaddr
:tSockAddrL
);
29 {$HINT Not actually testet, byt seems to work}
30 procedure FromSocket( var sockaddr
:tSockAddrL
);
31 {$HINT Not actually testet, byt seems to work}
33 procedure ToString( var str
:String );
34 {$HINT Not actually testet, byt seems to work}
35 procedure FromString( str
:String );
36 {$HINT Not actually testet, byt seems to work}
38 procedure LocalHost( af
: tFamily
);
39 {Generate localhost address of address family af.}
40 {$HINT Not actually testet, byt seems to work}
43 function isNil
:boolean;
47 case Family
: tFamily
of
48 { note: maximum family is 32 so byte is enough }
49 afInet
:( inet
:packed record
53 afInet6
:( inet6
:packed record
58 pad_pV4IlkA4mKQL
:packed array [0..128] of byte;
65 function ConvertFamily( a
:tFamily
): sa_family_t
;
67 operator
:= (net
: Word2
) host
:word;
68 operator
:= (net
: Word4
) host
:Dword
;
69 operator
:= (host
: word) net
:Word2
;
70 operator
:= (host
: Dword
) net
:Word4
;
72 Operator
= (aa
, ab
:t
) b
: boolean;
74 operator
:= ( at
: t
) aString
: string;
75 operator
:= ( aString
: string) at
: t
;
78 Operator := (aa :t ) r : pSockAddr;
79 Operator := ( aa :pSockAddr ) r : t;
84 Operator
= (aa
, ab
:Sockets
.tInAddr
) b
: boolean;
86 b
:=aa
.s_addr
=ab
.s_addr
;
89 Operator
= (aa
, ab
:t
) b
: boolean;
92 if aa
.data
.Family
<>ab
.data
.Family
then exit
;
93 case aa
.data
.Family
of
94 afInet
: if (aa
.data
.inet
.port
<>ab
.data
.inet
.port
) or (aa
.data
.inet
.addr
<>ab
.data
.inet
.addr
) then exit
;
95 afNil
: {null addresses are always equal};
101 function t
.Length
:Word;
103 result
:=(sizeof(self
)-sizeof(data
))+sizeof(data
.Family
);
106 afInet
: result
+=sizeof( data
.inet
);
107 afInet6
: result
+=sizeof( data
.inet6
);
108 else result
:=sizeof(self
);
112 function ConvertFamily( a
:tFamily
): sa_family_t
;
115 afInet
: result
:=Sockets
.AF_INET
;
116 afInet6
: result
:=Sockets
.AF_INET6
;
121 procedure t
.ToSocket( var sockaddr
:tSockAddrL
);
125 sockaddr
.sa_family
:=Sockets
.AF_INET
;
126 Move(data
.inet
, sockaddr
.sa_data
, sizeof(data
.inet
) );
129 sockaddr
.sa_family
:=Sockets
.AF_INET6
;
130 with tInetSockAddr6(pointer(@sockaddr
)^) do begin
131 sin6_port
:=data
.inet6
.port
;
133 sin6_addr
:=data
.inet6
.addr
;
141 procedure t
.FromSocket( var sockaddr
:tSockAddrL
);
143 case sockaddr
.sa_family
of
144 Sockets
.AF_INET
: begin
146 move(sockaddr
.sa_data
, data
.inet
, sizeof(data
.inet
) );
148 Sockets
.AF_INET6
: begin
149 data
.family
:=afInet6
;
150 move(sockaddr
.sa_data
, data
.inet6
, sizeof(data
.inet6
) );
152 else raise Exception
.Create('Unknown AF '+IntToStr(sockaddr
.sa_family
));
158 procedure t
.ToString( var str
:String );
162 str
:='//ip4/'+Sockets
.NetAddrToStr(data
.inet
.addr
)+
163 '/'+IntToStr(ShortNetToHost(data
.inet
.port
));
166 str
:='//ip6/'+Sockets
.NetAddrToStr6(data
.inet6
.addr
)+
167 '/'+IntToStr(ShortNetToHost(data
.inet6
.port
));
170 else str
:='//nil/UnknownAddressFamily';
174 procedure t
.FromString( str
:String );
178 if System
.Length(str
)=0 then begin Clear
; exit
end;
179 if Copy(str
,1,2)<>'//' then raise eConvertError
.Create('');
181 i
:=pos('/',str
); if i
=0 then i
:=System
.Length(str
)+1;
182 fam
:=copy(str
,1,i
-1);
184 if fam
='ip4' then begin
187 i
:=pos('/',str
); if i
=0 then i
:=System
.Length(str
)+1;
188 fam
:=copy(str
,1,i
-1);
190 data
.inet
.addr
:=StrToNetAddr(fam
);
192 i
:=pos('/',str
); if i
=0 then i
:=System
.Length(str
)+1;
193 fam
:=copy(str
,1,i
-1);
195 data
.inet
.port
:=ShortHostToNet(StrToInt(fam
));
197 end else if fam
='ip6' then begin
198 data
.family
:=afInet6
;
200 i
:=pos('/',str
); if i
=0 then i
:=System
.Length(str
)+1;
201 fam
:=copy(str
,1,i
-1);
203 data
.inet6
.addr
:=StrToNetAddr6(fam
);
205 i
:=pos('/',str
); if i
=0 then i
:=System
.Length(str
)+1;
206 fam
:=copy(str
,1,i
-1);
208 data
.inet6
.port
:=ShortHostToNet(StrToInt(fam
));
210 end else if fam
='nil' then begin
212 end else raise eConvertError
.Create('');
215 const cLocalHostIP4
:Sockets
.tInAddr
=( s_bytes
:(127,0,0,1) );
216 const cLocalIP4Port
:word=1030;
218 procedure t
.LocalHost( af
: tFamily
);
223 data
.inet
.port
:=ShortHostToNet(cLocalIP4Port
);
224 data
.inet
.addr
:=cLocalHostIP4
;
233 self
.data
.family
:=afNil
;
236 function t
.isNil
:boolean;
238 isNil
:= self
.data
.family
=afNil
;
241 operator
:= ( at
: t
) aString
: string;
243 at
.ToString( aString
);
245 operator
:= ( aString
: string) at
: t
;
247 at
.FromString( aString
);
250 operator
:= (net
: Word2
) host
:word;
254 host
:=ShortNetToHost( pnet
^ );
256 operator
:= (net
: Word4
) host
:Dword
;
260 host
:=LEtoN( pnet
^ );
263 operator
:= (host
: word) net
:Word2
;
267 pnet
^:= ShortHostToNet( host
);
269 operator
:= (host
: Dword
) net
:Word4
;
273 pnet
^:=NtoLE( host
);