【问题标题】:TcpListener: Reject an incoming connection request before connectionTcpListener:在连接前拒绝传入的连接请求
【发布时间】:2011-03-22 18:24:41
【问题描述】:

我有一项向公共互联网上的所有人开放的服务。它运行 TcpListener 来管理传入的连接。

该服务根据传入的 IP 地址维护一个持续行为不端的客户端列表。来自所列 IP 的任何连接都会在连接关闭时发送“离开”消息。

如果套接字一开始没有打开,我更喜欢它,但是当 AcceptTcpClient 返回时,连接已经打开。

有没有办法让我的代码在打开之前介入并检查传入的连接请求(并可能拒绝它们)?

非常感谢。

【问题讨论】:

    标签: c# .net security networking tcplistener


    【解决方案1】:

    WSAAccept 允许指定一个回调来决定是接受还是拒绝连接。有关如何从 C# 调用它,请参阅 this question

    【讨论】:

      【解决方案2】:

      由于您使用的是 .Net,我假设您必须在 Windows 下运行。

      套接字 API 无法满足您的需求。但是,您可以让您的程序添加 Windows 防火墙规则来完成同样的事情——假设您打开了 Windows 防火墙。

      【讨论】:

        【解决方案3】:

        对于仍在寻找可靠答案的任何人:

        TcpListener inListener;
        bool _canClientConnect = true;
        TcpClient _client;
        
        if (_inListener != null && _inListener.Pending() && _canClientConnect) { // Accept actual client
            _canClientConnect = false;
            _cancelTokenSource = new CancellationTokenSource();
            _client = _inListener.AcceptTcpClient();
            _stream = _client.GetStream();
            if (_recieverTask != null) {
                _recieverTask.Start();
            }
        }
        if (_inListener.Pending() && !_canClientConnect) { // Client found connecting, but we are already connected.
            _inListener.AcceptTcpClient().Close(); // Accept the client connection and immediately close it.
        }
        

        【讨论】:

        • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
        猜你喜欢
        • 2012-07-29
        • 2016-11-20
        • 2020-01-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-08-05
        • 1970-01-01
        相关资源
        最近更新 更多