Search code examples
c#socketstimeout

How to configure socket connect timeout


When the Client tries to connect to a disconnected IP address, there is a long timeout over 15 seconds... How can we reduce this timeout? What is the method to configure it?

The code I'm using to set up a socket connection is as following:

try
{
    m_clientSocket = new Socket(
         AddressFamily.InterNetwork,
         SocketType.Stream,
         ProtocolType.Tcp);

    IPAddress ip = IPAddress.Parse(serverIp);
    int iPortNo = System.Convert.ToInt16(serverPort);
    IPEndPoint ipEnd = new IPEndPoint(ip, iPortNo);

    m_clientSocket.Connect(ipEnd);
    if (m_clientSocket.Connected)
    {
        lb_connectStatus.Text = "Connection Established";
        WaitForServerData();
    }
}
catch (SocketException se)
{
    lb_connectStatus.Text = "Connection Failed";
    MessageBox.Show(se.Message);
}

Solution

  • I solved the problem by using Socket.ConnectAsync Method instead of Socket.Connect Method. After invoking the Socket.ConnectAsync(SocketAsyncEventArgs), start a timer (timer_connection), if time is up, check whether socket connection is connected (if(m_clientSocket.Connected)), if not, pop up timeout error.

    private void connect(string ipAdd,string port)
        {
            try
            {
                SocketAsyncEventArgs e=new SocketAsyncEventArgs();
    
    
                m_clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    
                IPAddress ip = IPAddress.Parse(serverIp);
                int iPortNo = System.Convert.ToInt16(serverPort);
                IPEndPoint ipEnd = new IPEndPoint(ip, iPortNo);
    
                //m_clientSocket.
                e.RemoteEndPoint = ipEnd;
                e.UserToken = m_clientSocket;
                e.Completed+=new EventHandler<SocketAsyncEventArgs>(e_Completed);                
                m_clientSocket.ConnectAsync(e);
    
                if (timer_connection != null)
                {
                    timer_connection.Dispose();
                }
                else
                {
                    timer_connection = new Timer();
                }
                timer_connection.Interval = 2000;
                timer_connection.Tick+=new EventHandler(timer_connection_Tick);
                timer_connection.Start();
            }
            catch (SocketException se)
            {
                lb_connectStatus.Text = "Connection Failed";
                MessageBox.Show(se.Message);
            }
        }
    private void e_Completed(object sender,SocketAsyncEventArgs e)
        {
            lb_connectStatus.Text = "Connection Established";
            WaitForServerData();
        }
        private void timer_connection_Tick(object sender, EventArgs e)
        {
            if (!m_clientSocket.Connected)
            {
                MessageBox.Show("Connection Timeout");
                //m_clientSocket = null;
    
                timer_connection.Stop();
            }
        }