5

時々中断されるようにオブジェクトをタイムアウトAcceptSocketにすることは可能ですか?TcpListener

TcpListener server = new TcpListener(localIP, port);
server.Start();
while (!shuttingDown)
    try
    {
        Socket client = server.AcceptSocket();
        if (client != null)
        {
            // do client stuff
        }
    }
    catch { }

BeginAccept と EndAccept を試す: 3 秒間のようにクライアントがいない場合、受け入れを終了するにはどうすればよいですか? (ここで解を近似しようとしています)

server.BeginAcceptTcpClient(new AsyncCallback(DoAcceptTcpClientCallback), server);
Thread.Sleep(3000);
server.EndAcceptTcpClient(???);
4

3 に答える 3

3

タイムアウト パラメータを受け入れる TcpListener.AcceptSocket のオーバーロードとして、次の拡張メソッドを作成しました。

    /// <summary>
    /// Accepts a pending connection request.
    /// </summary>
    /// <param name="tcpListener"></param>
    /// <param name="timeout"></param>
    /// <param name="pollInterval"></param>
    /// <exception cref="System.InvalidOperationException"></exception>
    /// <exception cref="System.TimeoutException"></exception>
    /// <returns></returns>
    public static Socket AcceptSocket(this TcpListener tcpListener, TimeSpan timeout, int pollInterval=10)
    {
        var stopWatch = new Stopwatch();
        stopWatch.Start();
        while (stopWatch.Elapsed < timeout)
        {
            if (tcpListener.Pending())
                return tcpListener.AcceptSocket();

            Thread.Sleep(pollInterval);
        }
        throw new TimeoutException();
    }
于 2015-03-17T03:29:06.803 に答える
0

リスニングソケットに読み取りタイムアウトを設定するだけです。これによりaccept()、C# に関係なく、読み取りタイムアウトが発生するのと同じ方法でタイムアウトが発生します。

于 2013-10-29T22:26:53.350 に答える
0

このコードは、接続を確立している新しいクライアントがあるかどうかを確認します。その場合AcceptSocket()は呼び出されます。唯一の問題は、サーバーがクライアントに迅速に応答するために頻繁にチェックする必要があることです。

TcpListener server = new TcpListener(localIP, port);
server.Start();
while (!shuttingDown)
{
    if (server.Pending())
    {
        Socket client = server.AcceptSocket();
        if (client != null)
        {
            // do client stuff
        }
    }
    else
        Thread.Sleep(1000);
}
于 2013-10-29T10:35:52.573 に答える