如何在C#中拒绝连接尝试?

3

我有一个监听连接的socket。我想要实现的是,在尝试连接时有接受/拒绝选项。这是我的代码:

private void StartListening()
{
    while (running)
    {
        AcceptingSocket.Listen(100);
        Socket client = AcceptingSocket.Accept();

        if (IncomingConnection!= null)
        {
            TcpEventArgs eventArgs = new TcpEventArgs(client);
            IncomingConnection(eventArgs);
        }
    }
}

有没有一种方法使 .Accept 检查用户是否想接受或拒绝连接?
2个回答

4

你(几乎)总是希望接受连接,因为是否连接的决定只能基于从客户端发送的信息(用户名、密码等)。

因此,在建立连接后,运行你的授权模块以收集身份验证信息,并根据此决定是否调用client上的Close(在你的示例中)。


但是,如果连接与否的决定基于传入的IPAddress,您将希望在不检查任何内容的情况下完全不接受该连接。 - knocte
这不是.NET API设计的悲哀后果吗? - knocte

4
正如@Blindy所说,您需要接受传入连接,然后在决定不想继续该连接时关闭它。在Accept返回之前,您没有对Socket的引用,因此无法执行任何允许您根据客户端(例如检查提供的凭据或连接的源地址)决定是否接受的操作。
从客户端的角度来看,一旦他们连接到Listening socket,连接就建立了(通过OS建立到侦听端口的连接,然后在Accept调用中交给您)。您无法在处于侦听状态的Socket上伪造“连接被拒绝/另一方主动拒绝连接”类型的错误。因此,Accept,然后是Close,对客户端来说与如果有某种方式让Accept中止连接是一样的。
如果您有一个程序化的原因不允许更多连接(例如您一次只想要一个客户端),那么在接受连接后关闭Listening socket可能是个好主意,但这通常是一个坏主意。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接