TCPClient & TCPListener |连接由对等崩溃 c# 重置
TCPClient & TCPListener | Connection reset by peer crash c#
我有一个 TCP 侦听器(服务器)和一个 TCP 客户端(客户端)(在 2 个不同的程序中)。
如果我的客户端被强制停止(CTRL^C 或其他),服务器程序将停止并出现此错误:
Unhandled Exception:
System.IO.IOException: Unable to read data from the transport connection: Connection reset by peer. ---> System.Net.Sockets.SocketException: Connection reset by peer
at System.Net.Sockets.Socket.Receive (System.Byte[] buffer, System.Int32 offset, System.Int32 size, System.Net.Sockets.SocketFlags socketFlags) [0x0001a] in <a9a08e39ba304bd0a84c49bd158dfc02>:0
at System.Net.Sockets.NetworkStream.Read (System.Byte[] buffer, System.Int32 offset, System.Int32 size) [0x000b4] in <a9a08e39ba304bd0a84c49bd158dfc02>:0
--- End of inner exception stack trace ---
at System.Net.Sockets.NetworkStream.Read (System.Byte[] buffer, System.Int32 offset, System.Int32 size) [0x0010f] in <a9a08e39ba304bd0a84c49bd158dfc02>:0
at loginserver.Program.ThreadProc (System.Object obj) [0x00090] in <a4c14a5640d24e26ae5e0c9bc660a224>:0
at System.Threading.QueueUserWorkItemCallback.WaitCallback_Context (System.Object state) [0x0000e] in <d0e12f672b88444ab4b6d9b2ecf20142>:0
at System.Threading.ExecutionContext.RunInternal (System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, System.Object state, System.Boolean preserveSyncCtx) [0x0008d] in <d0e12f672b88444ab4b6d9b2ecf20142>:0
at System.Threading.ExecutionContext.Run (System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, System.Object state, System.Boolean preserveSyncCtx) [0x00000] in <d0e12f672b88444ab4b6d9b2ecf20142>:0
at System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem () [0x0002a] in <d0e12f672b88444ab4b6d9b2ecf20142>:0
at System.Threading.ThreadPoolWorkQueue.Dispatch () [0x00096] in <d0e12f672b88444ab4b6d9b2ecf20142>:0
at System.Threading._ThreadPoolWaitCallback.PerformWaitCallback () [0x00000] in <d0e12f672b88444ab4b6d9b2ecf20142>:0
[ERROR] FATAL UNHANDLED EXCEPTION: System.IO.IOException: Unable to read data from the transport connection: Connection reset by peer. ---> System.Net.Sockets.SocketException: Connection reset by peer
at System.Net.Sockets.Socket.Receive (System.Byte[] buffer, System.Int32 offset, System.Int32 size, System.Net.Sockets.SocketFlags socketFlags) [0x0001a] in <a9a08e39ba304bd0a84c49bd158dfc02>:0
at System.Net.Sockets.NetworkStream.Read (System.Byte[] buffer, System.Int32 offset, System.Int32 size) [0x000b4] in <a9a08e39ba304bd0a84c49bd158dfc02>:0
--- End of inner exception stack trace ---
at System.Net.Sockets.NetworkStream.Read (System.Byte[] buffer, System.Int32 offset, System.Int32 size) [0x0010f] in <a9a08e39ba304bd0a84c49bd158dfc02>:0
at loginserver.Program.ThreadProc (System.Object obj) [0x00090] in <a4c14a5640d24e26ae5e0c9bc660a224>:0
at System.Threading.QueueUserWorkItemCallback.WaitCallback_Context (System.Object state) [0x0000e] in <d0e12f672b88444ab4b6d9b2ecf20142>:0
at System.Threading.ExecutionContext.RunInternal (System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, System.Object state, System.Boolean preserveSyncCtx) [0x0008d] in <d0e12f672b88444ab4b6d9b2ecf20142>:0
at System.Threading.ExecutionContext.Run (System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, System.Object state, System.Boolean preserveSyncCtx) [0x00000] in <d0e12f672b88444ab4b6d9b2ecf20142>:0
at System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem () [0x0002a] in <d0e12f672b88444ab4b6d9b2ecf20142>:0
at System.Threading.ThreadPoolWorkQueue.Dispatch () [0x00096] in <d0e12f672b88444ab4b6d9b2ecf20142>:0
at System.Threading._ThreadPoolWaitCallback.PerformWaitCallback () [0x00000] in <d0e12f672b88444ab4b6d9b2ecf20142>:0
我该怎么做才能取消这次崩溃。我想做一个服务器来管理我的网络,如果一台电脑被强行断开连接,我不想服务器崩溃。
我的代码:
服务器-
class Program
{
TcpListener server = null;
static void Main(string[] args)
{
TcpListener server = null;
try
{
string ports = args[1];
Int32 port = Int32.Parse(ports);
IPAddress localAddr = IPAddress.Parse(args[0]);
server = new TcpListener(localAddr, port);
server.Start();
TcpClient client;
while (true)
{
client = server.AcceptTcpClient();
ThreadPool.QueueUserWorkItem(ThreadProc, client);
}
}
catch (SocketException e)
{
Console.WriteLine("SocketException: {0}", e);
}
Console.WriteLine("\nHit enter to continue...");
Console.Read();
}
private static void ThreadProc(object obj)
{
var client = (TcpClient)obj;
Byte[] bytes = new Byte[256];
String data = null;
while (true)
{
Console.WriteLine("Waiting for a connection... ");
var networkStream = client.GetStream();
var pi = networkStream.GetType().GetProperty("Socket", BindingFlags.NonPublic | BindingFlags.Instance);
var socketIp = ((Socket)pi.GetValue(networkStream, null)).RemoteEndPoint.ToString();
Console.WriteLine("Connected -> " + socketIp);
data = null;
NetworkStream stream = client.GetStream();
int i;
while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
{
data = System.Text.Encoding.ASCII.GetString(bytes, 0, i);
Console.WriteLine("Received: {0}", data );
}
client.Close();
}
}
}
客户-
class Program
{
static void Main(string[] args)
{
while (true)
{
string IP = "localhost";
int port = 13000;
TcpClient client = new TcpClient();
try
{
client.Connect(IP, port);
}
catch (Exception ex)
{
Console.WriteLine("Error : " + ex.Message);
}
if (client.Connected)
{
NetworkStream stream = client.GetStream();
Console.WriteLine("Connected !");
string tosend = "Hey" !;
Console.WriteLine("Send: " + tosend);
Byte[] data = System.Text.Encoding.ASCII.GetBytes(tosend);
stream.Write(data, 0, data.Length);
while (client.Connected)
{
Thread.Sleep(1000);
}
stream.Close();
client.Close();
Thread.Sleep(10000);
}
}
}
}
看起来异常是在客户端关闭连接时引发的,但 server-side 上的消息未完全读取。在这种情况下,服务器试图从关闭的套接字中获取信息。
如果我是你,我会捕获异常并正确地从池中删除连接。
此外,我不清楚为什么在 Server.ThreadProc 方法中你在循环的每次迭代中调用 client.Close() 。可能会导致类似的问题。
我有一个 TCP 侦听器(服务器)和一个 TCP 客户端(客户端)(在 2 个不同的程序中)。
如果我的客户端被强制停止(CTRL^C 或其他),服务器程序将停止并出现此错误:
Unhandled Exception:
System.IO.IOException: Unable to read data from the transport connection: Connection reset by peer. ---> System.Net.Sockets.SocketException: Connection reset by peer
at System.Net.Sockets.Socket.Receive (System.Byte[] buffer, System.Int32 offset, System.Int32 size, System.Net.Sockets.SocketFlags socketFlags) [0x0001a] in <a9a08e39ba304bd0a84c49bd158dfc02>:0
at System.Net.Sockets.NetworkStream.Read (System.Byte[] buffer, System.Int32 offset, System.Int32 size) [0x000b4] in <a9a08e39ba304bd0a84c49bd158dfc02>:0
--- End of inner exception stack trace ---
at System.Net.Sockets.NetworkStream.Read (System.Byte[] buffer, System.Int32 offset, System.Int32 size) [0x0010f] in <a9a08e39ba304bd0a84c49bd158dfc02>:0
at loginserver.Program.ThreadProc (System.Object obj) [0x00090] in <a4c14a5640d24e26ae5e0c9bc660a224>:0
at System.Threading.QueueUserWorkItemCallback.WaitCallback_Context (System.Object state) [0x0000e] in <d0e12f672b88444ab4b6d9b2ecf20142>:0
at System.Threading.ExecutionContext.RunInternal (System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, System.Object state, System.Boolean preserveSyncCtx) [0x0008d] in <d0e12f672b88444ab4b6d9b2ecf20142>:0
at System.Threading.ExecutionContext.Run (System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, System.Object state, System.Boolean preserveSyncCtx) [0x00000] in <d0e12f672b88444ab4b6d9b2ecf20142>:0
at System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem () [0x0002a] in <d0e12f672b88444ab4b6d9b2ecf20142>:0
at System.Threading.ThreadPoolWorkQueue.Dispatch () [0x00096] in <d0e12f672b88444ab4b6d9b2ecf20142>:0
at System.Threading._ThreadPoolWaitCallback.PerformWaitCallback () [0x00000] in <d0e12f672b88444ab4b6d9b2ecf20142>:0
[ERROR] FATAL UNHANDLED EXCEPTION: System.IO.IOException: Unable to read data from the transport connection: Connection reset by peer. ---> System.Net.Sockets.SocketException: Connection reset by peer
at System.Net.Sockets.Socket.Receive (System.Byte[] buffer, System.Int32 offset, System.Int32 size, System.Net.Sockets.SocketFlags socketFlags) [0x0001a] in <a9a08e39ba304bd0a84c49bd158dfc02>:0
at System.Net.Sockets.NetworkStream.Read (System.Byte[] buffer, System.Int32 offset, System.Int32 size) [0x000b4] in <a9a08e39ba304bd0a84c49bd158dfc02>:0
--- End of inner exception stack trace ---
at System.Net.Sockets.NetworkStream.Read (System.Byte[] buffer, System.Int32 offset, System.Int32 size) [0x0010f] in <a9a08e39ba304bd0a84c49bd158dfc02>:0
at loginserver.Program.ThreadProc (System.Object obj) [0x00090] in <a4c14a5640d24e26ae5e0c9bc660a224>:0
at System.Threading.QueueUserWorkItemCallback.WaitCallback_Context (System.Object state) [0x0000e] in <d0e12f672b88444ab4b6d9b2ecf20142>:0
at System.Threading.ExecutionContext.RunInternal (System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, System.Object state, System.Boolean preserveSyncCtx) [0x0008d] in <d0e12f672b88444ab4b6d9b2ecf20142>:0
at System.Threading.ExecutionContext.Run (System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, System.Object state, System.Boolean preserveSyncCtx) [0x00000] in <d0e12f672b88444ab4b6d9b2ecf20142>:0
at System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem () [0x0002a] in <d0e12f672b88444ab4b6d9b2ecf20142>:0
at System.Threading.ThreadPoolWorkQueue.Dispatch () [0x00096] in <d0e12f672b88444ab4b6d9b2ecf20142>:0
at System.Threading._ThreadPoolWaitCallback.PerformWaitCallback () [0x00000] in <d0e12f672b88444ab4b6d9b2ecf20142>:0
我该怎么做才能取消这次崩溃。我想做一个服务器来管理我的网络,如果一台电脑被强行断开连接,我不想服务器崩溃。
我的代码:
服务器-
class Program
{
TcpListener server = null;
static void Main(string[] args)
{
TcpListener server = null;
try
{
string ports = args[1];
Int32 port = Int32.Parse(ports);
IPAddress localAddr = IPAddress.Parse(args[0]);
server = new TcpListener(localAddr, port);
server.Start();
TcpClient client;
while (true)
{
client = server.AcceptTcpClient();
ThreadPool.QueueUserWorkItem(ThreadProc, client);
}
}
catch (SocketException e)
{
Console.WriteLine("SocketException: {0}", e);
}
Console.WriteLine("\nHit enter to continue...");
Console.Read();
}
private static void ThreadProc(object obj)
{
var client = (TcpClient)obj;
Byte[] bytes = new Byte[256];
String data = null;
while (true)
{
Console.WriteLine("Waiting for a connection... ");
var networkStream = client.GetStream();
var pi = networkStream.GetType().GetProperty("Socket", BindingFlags.NonPublic | BindingFlags.Instance);
var socketIp = ((Socket)pi.GetValue(networkStream, null)).RemoteEndPoint.ToString();
Console.WriteLine("Connected -> " + socketIp);
data = null;
NetworkStream stream = client.GetStream();
int i;
while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
{
data = System.Text.Encoding.ASCII.GetString(bytes, 0, i);
Console.WriteLine("Received: {0}", data );
}
client.Close();
}
}
}
客户-
class Program
{
static void Main(string[] args)
{
while (true)
{
string IP = "localhost";
int port = 13000;
TcpClient client = new TcpClient();
try
{
client.Connect(IP, port);
}
catch (Exception ex)
{
Console.WriteLine("Error : " + ex.Message);
}
if (client.Connected)
{
NetworkStream stream = client.GetStream();
Console.WriteLine("Connected !");
string tosend = "Hey" !;
Console.WriteLine("Send: " + tosend);
Byte[] data = System.Text.Encoding.ASCII.GetBytes(tosend);
stream.Write(data, 0, data.Length);
while (client.Connected)
{
Thread.Sleep(1000);
}
stream.Close();
client.Close();
Thread.Sleep(10000);
}
}
}
}
看起来异常是在客户端关闭连接时引发的,但 server-side 上的消息未完全读取。在这种情况下,服务器试图从关闭的套接字中获取信息。 如果我是你,我会捕获异常并正确地从池中删除连接。
此外,我不清楚为什么在 Server.ThreadProc 方法中你在循环的每次迭代中调用 client.Close() 。可能会导致类似的问题。