private string GetLocalIP(string serverIP, int serverPort, int localPort)
{
NLogEx.LoggerEx logEx = new NLogEx.LoggerEx(log);
logEx.Trace("Enter: SipStackAdapter.GetLocalIP().");
try
{
IPAddress serverAddress = IPAddress.Parse(serverIP);
IPAddress[] arrIPAddresses = Dns.GetHostAddresses(System.Environment.MachineName);
foreach (IPAddress ip in arrIPAddresses)
{
//如果serverIP为IPv4
if (serverAddress.AddressFamily.Equals(AddressFamily.InterNetwork) && ip.AddressFamily.Equals(serverAddress.AddressFamily))
{
#region IPv4
IPEndPoint serverEndpoint = new IPEndPoint(serverAddress, serverPort);
Socket socketClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint clientEndpoint = new IPEndPoint(ip, localPort);
socketClient.Bind(clientEndpoint);
try
{
socketClient.Connect(serverEndpoint);
if (socketClient.Connected)
{
logEx.Trace("SipStackAdapter.try GetLocalIP ={0}.", ip.ToString());
return ip.ToString();
}
}
catch (SocketException e)
{
//logEx.Warn("SipStackAdapter.GetLocalIP failed,e.ErrorCode:{0}", e.ErrorCode);
if (e.ErrorCode == 10061 || e.ErrorCode == 10048) //Even No connection could be made because the target machine actively refused it ,but IP is valid.
{
logEx.Trace("SipStackAdapter.catch GetLocalIP ={0}.", ip.ToString());
return ip.ToString();
}
logEx.Error("SipStackAdapter.GetLocalIP failed.catch Execption message:{0}", e.Message);
}
finally
{
socketClient.Close();
logEx.Info("SipStackAdapter.GetLocalIP finally,Close the socketClient success");
}
#endregion
}
//如果serverIP为IPv6
else if (serverAddress.AddressFamily.Equals(AddressFamily.InterNetworkV6) && ip.AddressFamily.Equals(serverAddress.AddressFamily))
{
#region IPV6
IPEndPoint serverEndpoint = new IPEndPoint(serverAddress, serverPort);
Socket socketClient = new Socket(AddressFamily.InterNetworkV6, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint clientEndpoint = new IPEndPoint(ip, localPort);
socketClient.Bind(clientEndpoint);
try
{
socketClient.Connect(serverEndpoint);
if (socketClient.Connected)
{
logEx.Trace("SipStackAdapter.try GetLocalIP ={0}.", ip.ToString());
return ip.ToString();
}
}
catch (SocketException e)
{
//logEx.Warn("SipStackAdapter.GetLocalIP failed,e.ErrorCode:{0}", e.ErrorCode);
if (e.ErrorCode == 10061 || e.ErrorCode == 10048) //Even No connection could be made because the target machine actively refused it ,but IP is valid.
{
logEx.Trace("SipStackAdapter.catch GetLocalIP ={0}.", ip.ToString());
return ip.ToString();
}
logEx.Error("SipStackAdapter.GetLocalIP failed.catch Execption message:{0}", e.Message);
}
finally
{
socketClient.Close();
logEx.Info("SipStackAdapter.GetLocalIP finally,Close the socketClient success");
}
#endregion
}
}
return null;
}
catch (System.Exception ex)
{
logEx.Error("SipStackAdapter.GetLocalIP failed.Execption message:{0}", ex.Message);
return null;
}
}