gpt4 book ai didi

c# - 关闭最后一个连接后,如何通过套接字监听传入连接?

转载 作者:行者123 更新时间:2023-12-03 12:01:00 25 4
gpt4 key购买 nike

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

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 方法需要一个 bool 值来知道它是否应该开始监听更多的传入连接。

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

如何设置我的听力以再次开始聆听?

最佳答案

分为两种方法:startListening()continueListening()
开始收听将初始化所有内容,然后调用继续收听。你现在打电话的地方开始收听,改为继续收听。

或者,如果您想一次允许多个,只需输入 BeginAccept调用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);
}
}

关于c# - 关闭最后一个连接后,如何通过套接字监听传入连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15141961/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com