コード例 #1
0
        /// <summary>
        /// This method helps overcome what appears to be a problem in .NET MF v4.2 where Socket.Connect()
        /// may never return.
        /// </summary>
        /// <param name="ep"></param>
        private void CreateSocketAndConnect(IPEndPoint ep)
        {
            Exception exception = null;
            int retries = 1;

            while (retries > 0)
            {
                var t = new Thread(() =>
                {
                    try
                    {
                        CreateSocket(ep.GetAddressFamily());
                        _logger.LogMessage("Socket", LogLevel.Verbose, "Attempting connection to " + ep.Address);
                        _socket.Connect(ep);
                        _logger.LogMessage("Socket", LogLevel.Information, "Successfully connected to " + ep.Address);
                    }
                    catch (Exception ex)
                    {
                        _logger.LogMessage("Socket", LogLevel.Information, "Connection attempt failed for " + ep.Address + " Exception=" + ex);
                        exception = ex;
                    }
                });
                t.Start();

                if (!t.Join(10000))
                {
                    // If we timed out, we hit the bug. Try again.
                    retries--;
                }
                else
                {
                    if (exception != null)
                    {
                        throw exception;
                    }
                    break;
                }
            }
        }