Как настроить время ожидания подключения к сокету

Вы можете попробовать safeform плагин jquery.

$('#example').safeform({
    timeout: 5000, // disable form on 5 sec. after submit
    submit: function(event) {
        // put here validation and ajax stuff...

        // no need to wait for timeout, re-enable the form ASAP
        $(this).safeform('complete');
        return false;
    }
})

97
задан djv 6 February 2015 в 16:21
поделиться

5 ответов

Я решил проблему, используя метод Socket.ConnectAsync вместо метода Socket.Connect. После вызова Socket.ConnectAsync (SocketAsyncEventArgs) запустите таймер (timer_connection), если время истекло, проверьте, подключено ли соединение с сокетом (если (m_clientSocket.Connected)), если нет, появится ошибка тайм-аута.

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();
        }
    }
4
ответ дан 24 November 2019 в 05:14
поделиться

Я не программирую на C #, но на C мы решаем ту же проблему, делая сокет неблокирующим, а затем помещая fd в цикл выбора / опроса со значением тайм-аута, равным количеству времени мы готовы дождаться успешного подключения.

Я нашел это для Visual C ++, и объяснение там также относится к механизму выбора / опроса, который я объяснил ранее.

По моему опыту, вы не можете изменить значения тайм-аута подключения для каждого сокета. Вы меняете его для всех (настраивая параметры ОС).

8
ответ дан 24 November 2019 в 05:14
поделиться

В классе Socket должно быть свойство ReceiveTimeout.

Свойство Socket.ReceiveTimeout

-8
ответ дан 24 November 2019 в 05:14
поделиться

Проверьте это на MSDN . Не похоже, что вы можете сделать это с помощью реализованных свойств в классе Socket.

Автор сообщения на MSDN на самом деле решил свою проблему с помощью потоковой передачи. У него был главный поток, который вызывал другие потоки, которые запускали код соединения в течение пары секунд, а затем проверяли свойство Connected сокета:

Я создал другой метод, который на самом деле подключил розетку ... был основной спящий поток на 2 секунды, а затем проверьте способ подключения (который выполняется в отдельном потоке), если розетка была подключена правильно, иначе выбросить исключение "Истекло время ожидания" и вот и все. Еще раз спасибо за repleies.

Что вы пытаетесь сделать, и почему он не может подождать 15-30 секунд, прежде чем истечет время ожидания?

2
ответ дан 24 November 2019 в 05:14
поделиться

Я только что написал класс расширения чтобы разрешить таймауты в соединениях. Используйте его точно так же, как вы использовали бы стандартные методы Connect () , с дополнительным параметром с именем timeout .

using System;
using System.Net;
using System.Net.Sockets;

/// <summary>
/// Extensions to Socket class
/// </summary>
public static class SocketExtensions
{
    /// <summary>
    /// Connects the specified socket.
    /// </summary>
    /// <param name="socket">The socket.</param>
    /// <param name="host">The host.</param>
    /// <param name="port">The port.</param>
    /// <param name="timeout">The timeout.</param>
    public static void Connect(this Socket socket, string host, int port, TimeSpan timeout)
    {
        AsyncConnect(socket, (s, a, o) => s.BeginConnect(host, port, a, o), timeout);
    }

    /// <summary>
    /// Connects the specified socket.
    /// </summary>
    /// <param name="socket">The socket.</param>
    /// <param name="addresses">The addresses.</param>
    /// <param name="port">The port.</param>
    /// <param name="timeout">The timeout.</param>
    public static void Connect(this Socket socket, IPAddress[] addresses, int port, TimeSpan timeout)
    {
        AsyncConnect(socket, (s, a, o) => s.BeginConnect(addresses, port, a, o), timeout);
    }

    /// <summary>
    /// Asyncs the connect.
    /// </summary>
    /// <param name="socket">The socket.</param>
    /// <param name="connect">The connect.</param>
    /// <param name="timeout">The timeout.</param>
    private static void AsyncConnect(Socket socket, Func<Socket, AsyncCallback, object, IAsyncResult> connect, TimeSpan timeout)
    {
        var asyncResult = connect(socket, null, null);
        if (!asyncResult.AsyncWaitHandle.WaitOne(timeout))
        {
            try
            {
                socket.EndConnect(asyncResult);
            }
            catch (SocketException)
            { }
            catch (ObjectDisposedException)
            { }
        }
    }
22
ответ дан 24 November 2019 в 05:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: