public void Start()
{
lock (m_lock)
{
// ensure a valid port.
int port = m_uri.Port;
if (port <= 0 || port > UInt16.MaxValue)
{
port = Utils.UaTcpDefaultPort;
}
// create IPv4 socket.
try
{
IPEndPoint endpoint = new IPEndPoint(IPAddress.Any, port);
m_listeningSocket = new Socket(endpoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
SocketAsyncEventArgs args = new SocketAsyncEventArgs();
args.Completed += OnAccept;
args.UserToken = m_listeningSocket;
m_listeningSocket.Bind(endpoint);
m_listeningSocket.Listen(Int32.MaxValue);
m_listeningSocket.AcceptAsync(args);
}
catch (Exception ex)
{
// no IPv4 support.
m_listeningSocket = null;
Utils.Trace("failed to create IPv4 listening socket: " + ex.Message);
}
// create IPv6 socket
try
{
IPEndPoint endpointIPv6 = new IPEndPoint(IPAddress.IPv6Any, port);
m_listeningSocketIPv6 = new Socket(endpointIPv6.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
SocketAsyncEventArgs args = new SocketAsyncEventArgs();
args.Completed += OnAccept;
args.UserToken = m_listeningSocketIPv6;
m_listeningSocketIPv6.Bind(endpointIPv6);
m_listeningSocketIPv6.Listen(Int32.MaxValue);
m_listeningSocketIPv6.AcceptAsync(args);
}
catch (Exception ex)
{
// no IPv6 support
m_listeningSocketIPv6 = null;
Utils.Trace("failed to create IPv6 listening socket: " + ex.Message);
}
if (m_listeningSocketIPv6 == null && m_listeningSocket == null)
{
throw ServiceResultException.Create(
StatusCodes.BadNoCommunication,
"Failed to establish tcp listener sockets for Ipv4 and IPv6.\r\n");
}
}
}