+function TTCPConnection.IsNullAddress(SockAddr: PSockAddr): boolean;
+begin
+ if SockAddr^.sin_family = AF_INET then
+ Result:= SockAddr^.sin_addr.s_addr = 0
+ else if SockAddr^.sin_family = AF_INET6 then
+ Result:= (PSockAddr6(SockAddr)^.sin6_addr.u6_addr32[0] = 0)
+ and (PSockAddr6(SockAddr)^.sin6_addr.u6_addr32[1] = 0)
+ and (PSockAddr6(SockAddr)^.sin6_addr.u6_addr32[2] = 0)
+ and (PSockAddr6(SockAddr)^.sin6_addr.u6_addr32[3] = 0)
+ else
+ Result:= true;
+end;
+
+function TTCPConnection.BindSrcAddr(Socket: socket; Family: word): cint;
+var SockAddr: PSockAddr; addrlen: size_t;
+begin
+ case Family of
+ AF_INET:
+ begin
+ SockAddr:= @SrcSockAddr;
+ addrlen:= SizeOf(SrcSockAddr);
+ end;
+ AF_INET6:
+ begin
+ SockAddr:= @SrcSockAddr6;
+ addrlen:= SizeOf(SrcSockAddr6);
+ end;
+ end;
+
+ if not IsNullAddress(SockAddr) then
+ Result:= fpBind(Socket, SockAddr, addrlen)
+ else
+ Result:= 0;
+end;
+
+function TTCPConnection.SetBindAddress(Family: word; const HostName: string): boolean;
+var GAIResult: TGAIResult; SockAddr: PSockAddr;
+begin
+ GAIResult:= ResolveHost(HostName, Family);
+ if GAIResult.GAIError = 0 then begin
+ case GAIResult.AddrInfo^.ai_family of
+ AF_INET: SockAddr:= @SrcSockAddr;
+ AF_INET6: SockAddr:= @SrcSockAddr6;
+ end;
+ Move(GAIResult.AddrInfo^.ai_addr^, SockAddr^, GAIResult.AddrInfo^.ai_addrlen);
+ FreeHost(GAIResult);
+ Result:= true;
+ end
+ else
+ Result:= false;
+end;
+