C# socket 远程主机强迫关闭了一个现有的连接。

C# socket 远程主机强迫关闭了一个现有的连接。

GLog.WriteBalanceLog("创迹服务socket连接");
int port = 8000;
clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
clientSocket.ReceiveTimeout = 1000;
IPAddress address = IPAddress.Parse("127.0.0.1");
IPEndPoint endPoint = new IPEndPoint(address, port);
clientSocket.Connect(endPoint);
GLog.WriteBalanceLog("向服务器发起连接......成功." + Environment.NewLine);

GLog.WriteBalanceLog("创迹服务socket初始化");
string rootPath = Environment.CurrentDirectory + "\\AiModule";                     
rootPath = rootPath.Replace("\\", "//");                     
string str_data = "{\r\n\"companyID\":\"5FRataJkbt1pruRUA3TKqA==\",\r\n\"appKey\":\"06728fcc4b4f4eea89721014ba7b807c\",\r\n\"secretKey\":\"9062a8f43f7c4b6fa2203011ab9c3458\",\r\n\"serviceKey\":\"4c495ca26fb2efb21e3b90edf299e7ed\",\r\n\"rootPath\":\"" + rootPath + "\",\r\n\"mode\":0\r\n}";                     
string str_command = "{\"command\":\"init\",\"data\":" + str_data + "}";                     
byte[] buffer = Encoding.Default.GetBytes(str_command);                     
clientSocket.Send(buffer);
byte[] recBuffer = new byte[1024 * 1024 * 2];
int length = -1;
GLog.WriteBalanceLog("创迹服务socket初始化_9");                     
length = clientSocket.Receive(recBuffer);
GLog.WriteBalanceLog("创迹服务socket初始化_10");
if (length < 0)
{                         
aIBalacnceResult.IsSuccess = false;                      
aIBalacnceResult.Message = string.Format("创迹服务socket初始化失败!");
return aIBalacnceResult;
}

string msg = Encoding.UTF8.GetString(recBuffer, 0, length);  

length = clientSocket.Receive(recBuffer);
在调试模式下不会报错,在程序正常运行会报 “socket 远程主机强迫关闭了一个现有的连接。”

要看看你的日志了,楼上说的客户端问题包括网络不稳都会引发

一般都是客户端连接导致错误。看一下运行模式下客户端是否进行了错误操作。

三种情况
服务器端程序执行了 Socket.Close
服务器端程序强行退出造成的。
服务器有并发的最大连接数限制?

检查下服务端的socket代码或者端口等,发生这个错误,应该是客户端连接后,服务端认为客户端没有响应主动关闭了客户端的链接。检查下连接超时时间,确保网络是正常的。


Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

socket.Connect("127.0.0.1", 80);

socket.Close();

以下答案由GPT-4.5Plus大模型(语音)与博主A努力中.......共同编写:

这个异常表示远程主机已经关闭了和本地主机的TCP连接。这通常是因为以下几个原因:

  1. 网络连接中断。网络连接出现问题,导致TCP连接被关闭。
  2. 远程主机重启。远程主机重新启动会导致现有TCP连接被关闭。
  3. 远程主机上的应用程序出现异常。远程主机上的某个应用程序由于异常退出等原因关闭了TCP连接。
  4. 远程主机的防火墙或安全组设置变更。远程主机的网络安全设置更新导致某些TCP连接被关闭。
  5. 超时导致连接关闭。TCP连接在一定时间内没有活动,被视为超时连接从而被关闭。

这类异常通常会在客户端程序连接远程服务器或等待远程主机响应时发生。对此,常见的处理方法有:

  1. 捕获该异常,并进行重试。可以在连接失败后,重试若干次,以防网络等临时异常。
  2. 检查本地网络连接。确认本地网络连接是否正常,排除本地网络问题。
  3. 与远程主机联系以确认详情。如果连接频繁异常,需要查看远程主机以确认具体原因,可能需要更新配置或重启相关服务。
  4. 增大连接超时时间。如果由于连接空闲超时导致,可以适当增加超时时间。
  5. 更新远程主机防火墙设置。如果由于远程主机网络安全设置更新导致,需要更新设置来允许客户端IP或端口访问。

下面是一个简单的C# socket客户端程序,演示了如何处理该异常:

csharp
using System;
using System.Net;
using System.Net.Sockets;

namespace SocketClient
{
    class Program
    {
        static void Main(string[] args)
        {
            Socket socket = null;
            try
            {
                socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                socket.Connect(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8000));
            }
            catch (SocketException ex)
            {
                Console.WriteLine(ex.Message);
                return;
            }

            byte[] data = new byte[1024];
            while (true)
            {
                try 
                {
                    int count = socket.Receive(data);
                    string msg = Encoding.UTF8.GetString(data, 0, count);
                    Console.WriteLine(msg);
                }
                catch (SocketException ex)
                {
                    Console.WriteLine(ex.Message);
                    break;
                }
            }

            socket.Shutdown(SocketShutdown.Both);
            socket.Close();
        }
    }
}

运行这个客户端程序,当远程主机关闭连接时,会捕获SocketException并打印异常消息,结束程序运行。