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)显然,这需要提供对套接字的访问。添加了代码。我不是电脑迷,我是Java迷。所以有些语法可能是错误的。但我想有一个问题很容易解决,这很好用。谢谢你的帮助。如果您不介意的话,您能解释一下为什么这里实现了两个套接字吗?在侦听器和处理程序之间,我对它们的角色有点困惑。我不知道处理程序套接字的作用。我完全忽略了它。