簡體   English   中英

C# 已建立的連接被主機中的軟件中止

[英]C# An established connection was aborted by the software in your host machine

這些錯誤在我的游戲服務器上越來越頻繁。 它們導致服務器不斷關閉並重新啟動......

System.Net.Sockets.SocketException (0x80004005): An established connection was aborted by the software in your host machine 
   at System.Net.Sockets.Socket.BeginSend(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags, AsyncCallback callback, Object state) 
   at iRP.Game.Sessions.Session.SendData(Byte[] Data)

這是生成這些錯誤的代碼:

public void SendData(byte[] Data)
{
    try
    {
        if (mSocket == null)
        {
            //Output.WriteLine("[SND] Socket has a null exception, which means it is now invalid. Remove this socket!", OutputLevel.CriticalError);
        }
        else
        {
            mSocket.BeginSend(Data, 0, Data.Length, SocketFlags.None, sendCallback, mSocket);
        }
    }
    catch (Exception e)
    {
        string WhatToWrite = "Error handled (SESSION): " + e.ToString() + "\n\n" + e.Message + "\n\nStack: " + e.StackTrace + Environment.NewLine + "\n\n";
        File.AppendAllText(Environment.CurrentDirectory + "\\data\\fatal.txt", WhatToWrite);
        Program.Stop();
    }
}

緩沖區大小設置正確,我們在套接字上使用 KeepAlive 並使用發送和接收超時。

人們建議禁用防火牆會有所幫助,但每當我這樣做時,我們的游戲服務器(專用服務器)都會重新啟動,就好像它受到攻擊一樣,所以防火牆必須保持啟用狀態。

其他人對此有任何其他解決方案嗎?

PS:我們支持 DDoS 緩解服務,這可能會限制連接數......

已建立的連接被主機中的軟件中止

這是一個樣板錯誤消息,它來自 Windows。 底層錯誤代碼是 WSAECONNABORTED。 這真的不僅僅意味着“連接被中止”。 您必須對短語的“您的主機”部分小心謹慎。 在絕大多數 Windows 應用程序中,確實是桌面應用程序所連接的主機中止了連接。 通常是其他地方的服務器。

但是,當您實現自己的服務器時,角色會顛倒過來。 現在您需要將錯誤消息閱讀為“被線路另一端的應用程序中止”。 當您實現服務器時,這當然並不少見,使用您的服務器的客戶端程序不太可能出於任何原因中止連接。 可能意味着防火牆或代理終止了連接,但這不太可能,因為它們通常首先不允許建立連接。

除非您了解線路另一端發生的情況,否則您並不真正知道為什么連接被中止。 這當然很難得到。 如果您的服務器可以通過 Internet 訪問,那么請不要忽視端口掃描程序正在探測您的可能性。 或者您的客戶,正在尋找游戲作弊。

如果兩個軟件使用同一個端口連接服務器就會出現這個問題
嘗試根據您的操作系統通過cmd關閉端口
然后重新啟動您的 Android 工作室或您的 Eclipse 或您的軟件。

可能與最大並發請求數有關。 我能夠通過兩種解決方案來修復它:

  • 增加最大並發連接的默認限制(默認設置為2 ):
ServicePointManager.DefaultConnectionLimit = 25
  • 將發送請求包裹在緩沖區周圍:可以使用ConcurrentQueue來限制速率,或者實現一個簡單的等待,如下所示:
while (activeRequests >= maxConcurrentRequests)
    Thread.Sleep(1000);

Interlocked.Increment(ref activeRequests);
var response = await _client.GetStreamAsync(endpoint);
Interlocked.Decrement(ref activeRequests);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM