Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.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_Asynchronous - Fatal编程技术网

C# 断开连接后,使用插座再次开始收听

C# 断开连接后,使用插座再次开始收听,c#,sockets,asynchronous,C#,Sockets,Asynchronous,我正在编写一个小型C#Sockets应用程序。实际上我有两个,一个服务器和一个客户端 用户运行客户端,输入服务器的IP和端口,按下“连接”,然后一旦连接,他们就可以在文本框中输入文本并将其发送到服务器 服务器只显示“无连接”或“来自[ip]:[port]的连接”,以及下面最新收到的消息 服务器成功地接收消息,甚至可以很好地处理客户端断开连接。 现在,我试图让它在客户端断开连接后再次侦听,但由于某些原因,我尝试的任何操作都不会允许它再次开始侦听 以下是我的部分代码: Socket sock

我正在编写一个小型C#Sockets应用程序。实际上我有两个,一个服务器和一个客户端

用户运行客户端,输入服务器的IP和端口,按下“连接”,然后一旦连接,他们就可以在文本框中输入文本并将其发送到服务器

服务器只显示“无连接”或“来自[ip]:[port]的连接”,以及下面最新收到的消息

服务器成功地接收消息,甚至可以很好地处理客户端断开连接。 现在,我试图让它在客户端断开连接后再次侦听,但由于某些原因,我尝试的任何操作都不会允许它再次开始侦听

以下是我的部分代码:

    Socket socket;
    private void listen()
    {
        socket = new Socket(AddressFamily.InterNetwork,
            SocketType.Stream, ProtocolType.Tcp);
        socket.Bind(new IPEndPoint(IPAddress.Any, 12345));
        socket.Listen(10);
        socket.BeginAccept(new AsyncCallback(acceptAsync), socket);
    }

最后一行:listen();是什么抛出了错误。 我尝试再次简单地调用socket.beginacept(),但这也引发了一个异常

我得到的信息是:

每个套接字地址(协议/网络地址/端口)通常只允许使用一次

如果我不调用listen()函数,而只调用socket.beginacept(),那么我会得到“您必须首先调用socket.listen()”

如果我调用socket.listen()函数,它会告诉我它已经连接好了,然后开始监听


一旦我建立了一个异步连接,并收到了几条异步消息,那么我如何再次开始接收呢?

您的
套接字
变量在您第二次调用
listen()
时已经分配了一个侦听套接字,这就是为什么它告诉您只允许一次使用。您需要重复的就是
socket.beginacept(新的AsyncCallback(AcceptSync),socket)
调用。因此,试着用
socket替换
receiveAsync(…)
方法中对
listen()
的调用。在async
Begin*
中,BeginAccept(新的异步回调(acceptsync),socket)
后面总是跟着
End*
。请参阅使用。您的accept方法应类似于:

try {
        listener.Bind(localEP);
        listener.Listen(10);

        while (true) {
            allDone.Reset();

            Console.WriteLine("Waiting for a connection...");
            listener.BeginAccept(
                new AsyncCallback(SocketListener.acceptCallback), 
                listener );

            allDone.WaitOne();
        }
    } catch (Exception e) {
服务器,表示在指定端口/ip上侦听的应用程序。通常,总是处于侦听模式-这就是为什么它被称为服务器。它可以连接和断开客户端,但始终处于侦听模式

这意味着,当服务器断开客户机的连接时——即使在断开连接时——它仍处于侦听模式;这意味着它也可以接受传入的连接

不过,断开连接请求可以来自客户端,也可以由服务器强制应用

服务器的进程是:

  • 绑定到套接字
  • 接受连接
  • 客户的流程是:

  • 连接到服务器
  • 发送/接收消息
  • 服务器有几种方法来处理传入的客户端,如下所示:

    • 传入连接在列表中维护,例如在
      列表中
    • 处理传入客户端的一种方法是通过线程。例如,对于每个传入的客户机,生成一个线程来处理服务器和客户机之间的通信。例如
    _

    • 使用单线程和上下文切换来管理客户端通信(TX/RX)

    请发布更多代码。听起来好像您没有正确处理侦听套接字就扔掉了它,而且它还没有被垃圾收集,因此端口仍然由它保持打开状态。您在哪里调用
    EndAccept
    at?
    try {
            listener.Bind(localEP);
            listener.Listen(10);
    
            while (true) {
                allDone.Reset();
    
                Console.WriteLine("Waiting for a connection...");
                listener.BeginAccept(
                    new AsyncCallback(SocketListener.acceptCallback), 
                    listener );
    
                allDone.WaitOne();
            }
        } catch (Exception e) {
    
    private  void ListenForClients()
    {
      this.tcpListener.Start();
    
      while (true)
      {
        //blocks until a client has connected to the server
        TcpClient client = this.tcpListener.AcceptTcpClient();
    
        //create a thread to handle communication
        //with connected client
        Thread clientThread = new Thread(new ParameterizedThreadStart(HandleClientComm));
        clientThread.Start(client);
      }
    }