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

C# 在最后一个连接关闭后,如何通过套接字侦听传入连接?

C# 在最后一个连接关闭后,如何通过套接字侦听传入连接?,c#,sockets,listener,C#,Sockets,Listener,我正在设置一个套接字以侦听传入的连接: public Socket Handler; public void StartListening() { // Establish the locel endpoint for the socket IPEndPoint localEndPoint = new IPEndPoint(IPAddress.Any, Port); // Create a TCP/IP socket Socket listener = new

我正在设置一个套接字以侦听传入的连接:

public Socket Handler;

public void StartListening()
{
    // Establish the locel endpoint for the socket
    IPEndPoint localEndPoint = new IPEndPoint(IPAddress.Any, Port);

    // Create a TCP/IP socket
    Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

    try
    {
        // Bind the socket to the local endpoint and listen
        listener.Blocking = false;
        listener.Bind(localEndPoint);
        listener.Listen(100);

        // Start an asynchronous socket to listen for connections
        listener.BeginAccept( new AsyncCallback(AcceptCallback), listener);
    }
    catch (Exception e)
    {
        invokeStatusUpdate(0, e.Message);
    }            
}

private void AcceptCallback(IAsyncResult ar)
{
    // Get the socket that handles the client request
    Socket listener = (Socket) ar.AsyncState;
    Socket handler = listener.EndAccept(ar);
    Handler = handler;

    // Create the state object
    StateObject state = new StateObject();
    state.workSocket = handler;
    handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReceiveCallback), state);
}
正如您在上面看到的,一旦建立了连接,我就设置了BeginReceive回调。这个很好用

最后,我想关闭当前连接,然后再次开始监听我的套接字,以尝试输入连接:

public void CloseNode(bool restart)
{
    try
    {
        if (Handler != null)
        {
            Handler.Shutdown(SocketShutdown.Both);
            Handler.Close();
            Handler.Dispose();
            Handler = null;
        }

        if (restart)
            StartListening();
    }
    catch (Exception e)
    {
        invokeStatusUpdate(0, e.Message);
    }
}
我的close方法使用一个布尔值来确定它是否应该开始侦听更多的传入连接

问题是,当我回到我的
StartListening
方法时,我在
listener.Bind(localEndPoint)行上得到一个异常表示“每个套接字地址(协议/网络地址/端口)通常只允许使用一次”


如何设置我的听力以重新开始听力?

将其分为两种方法:
startListening()
continueListening()

“开始侦听”将初始化所有内容,然后调用“继续侦听”。如果您要在结尾处调用start listening,请改为调用continue listening

或者,如果希望一次允许多个,只需将
beginacept
调用放入
while(true)
循环中即可。这将永远接受所有传入连接,即使其他人已连接。这就是为什么它毕竟是异步的

这是您的成员变量

public Socket Handler;
private socket listener; // added by corsiKa
这是你的新开始方法

public void StartListening()
{
    // Establish the locel endpoint for the socket
    IPEndPoint localEndPoint = new IPEndPoint(IPAddress.Any, Port);

    // Create a TCP/IP socket
    listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

    try
    {
        // Bind the socket to the local endpoint and listen
        listener.Blocking = false;
        listener.Bind(localEndPoint);
        listener.Listen(100);

        // Start an asynchronous socket to listen for connections
        performListen(listener); // changed by corsiKa
    }
    catch (Exception e)
    {
        invokeStatusUpdate(0, e.Message);
    }            
}
这是你的表演-倾听方法

// added by corsiKa
private void performListen(Socket listener) {
    listener.BeginAccept( new AsyncCallback(AcceptCallback), listener);
}
这是你的新关闭方法

// variable name changed by corsiKa
public void CloseNode(bool acceptMoreConnections)
{
    try
    {
        if (Handler != null)
        {
            Handler.Shutdown(SocketShutdown.Both);
            Handler.Close();
            Handler.Dispose();
            Handler = null;
        }
        // changed by corsiKa
        if (acceptMoreConnections)
            performListen(listener);
    }
    catch (Exception e)
    {
        invokeStatusUpdate(0, e.Message);
    }
}

我一次只想要一个连接。我不确定我会在哪里分解这个方法来实现你的建议。我是否应该将该套接字设为全局套接字,并让
ContinueListening
方法只需调用
beginacept
?如果(重新启动)startListening(),实际上可以替换
if(restart)listener.beginacept(新的异步回调(AcceptCallback),listener)