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