Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在c#中拒绝连接尝试?_C#_Sockets_Tcp - Fatal编程技术网

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

如何在c#中拒绝连接尝试?,c#,sockets,tcp,C#,Sockets,Tcp,我有一个监听连接的套接字。我想做的是在尝试连接时有一个接受/拒绝选项。这是我的代码: private void StartListening() { while (running) { AcceptingSocket.Listen(100); Socket client = AcceptingSocket.Accept(); if (IncomingConnection!= null) {

我有一个监听连接的套接字。我想做的是在尝试连接时有一个接受/拒绝选项。这是我的代码:

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

        if (IncomingConnection!= null)
        {
            TcpEventArgs eventArgs = new TcpEventArgs(client);
            IncomingConnection(eventArgs);
        }
    }
}
有没有一种方法可以让
.Accept
检查用户是想接受还是拒绝连接?

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


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

正如@Blindy所说,您需要接受传入的连接,如果您决定不想继续连接,请关闭它。在
Accept
返回之前,您没有对
套接字的引用,因此无法根据客户端(如检查提供的凭据或连接的源地址)来决定是否接受

从客户端的角度来看,一旦他们连接到
Listen
ing套接字,就会建立连接(操作系统会建立到侦听端口的连接,然后在
Accept
调用中移交给您)。您不能在处于侦听状态的
套接字上伪造“拒绝连接/对方主动拒绝连接”类型的错误。因此,在客户端看来,
Accept
,后跟
Close
,看起来与
Accept
中止连接的方式相同


如果您有不允许更多连接的编程原因(例如一次只需要一个客户端),那么您可以在
Listen
ing套接字接受连接后关闭它,但这通常不是一个好主意。

但是如果是否连接的决定是基于传入的IPAddress呢?在不检查任何东西的情况下,您根本不想接受这种连接。这是.NET API设计的一个可悲的结果,不是吗?