Hi! It seems that the StrToNetAddr6 function is not implemented yet (http://svn.freepascal.org/svn/fpc/trunk/rtl/inc/sockets.inc). I wrote an implementation (attached as file including some testcases). I hope you can use it for the Sockets unit.
Bye Hansi
Program IP6; Function StrToNetAddr6(IP : String) : TIn6_addr; Var Part : String; IPv6 : TIn6_addr; P,J : Integer; W : Word; Index : Integer; ZeroAt : Integer; Begin FillChar(IPv6,SizeOf(IPv6),0); { Every 16-bit block is converted at its own and stored into Result. When } { the '::' zero-spacer is found, its location is stored. Afterwards the } { address is shifted and zero-filled. } Index := 0; ZeroAt := -1; J := 0; P := Pos(':',IP); While (P > 0) and (Length(IP) > 0) and (Index < 8) do Begin Part := '$'+Copy(IP,1,P-1); Delete(IP,1,P); if Length(Part) > 1 then { is there a digit after the '$'? } Val(Part,W,J) else W := 0; IPv6.u6_addr16[Index] := HtoNS(W); if J <> 0 then Begin FillChar(IPv6,SizeOf(IPv6),0); Exit; End; if IP[1] = ':' then Begin ZeroAt := Index; Delete(IP,1,1); End; Inc(Index); P := Pos(':',IP); if P = 0 then P := Length(IP)+1; End; { address a:b:c::f:g:h } { Result now a : b : c : f : g : h : 0 : 0, ZeroAt = 2, Index = 6 } { Result after a : b : c : 0 : 0 : f : g : h } if ZeroAt >= 0 then Begin Move(IPv6.u6_addr16[ZeroAt+1],IPv6.u6_addr16[(8-Index)+ZeroAt+1],2*(Index-ZeroAt-1)); FillChar(IPv6.u6_addr16[ZeroAt+1],2*(8-Index),0); End; Result := IPv6; End; Begin StrToNetAddr6('1:2:3:4:5:6:7:8'); StrToNetAddr6('1:2:3::7:8'); StrToNetAddr6('1:2:3:4:5:6::'); StrToNetAddr6('::4:5:6:7:8'); StrToNetAddr6('::7:8'); StrToNetAddr6('1:2::'); StrToNetAddr6('::8'); StrToNetAddr6('::'); End;
_______________________________________________ fpc-devel maillist - fpc-devel@lists.freepascal.org http://lists.freepascal.org/mailman/listinfo/fpc-devel