从本地文件写入文件流时出现IOException

时间:2018-12-17 14:59:35

标签: c# unity3d filestream ioexception httplistener

我设置了一个HttpListener,它监听本地主机上的文件请求。我按如下方式初始化监听器:

public HTTPRequestListener(ServerManager servermanager)
{
    this.serverManager = servermanager;
    listener = new HttpListener();
    listener.Prefixes.Add("http://" + GetLocalIPAddress() + ":50003/");

    listener.Start();
    httpListenerThread = new Thread(RunListener);
    httpListenerThread.Start();
}

/// <summary>
/// Returns the local ip, courtesy of https://stackoverflow.com/a/6803109/8628766
/// </summary>
public static string GetLocalIPAddress()
{
    var host = Dns.GetHostEntry(Dns.GetHostName());
    foreach (var ip in host.AddressList)
    {
        if (ip.AddressFamily == AddressFamily.InterNetwork)
        {
            return ip.ToString();
        }
    }
    throw new Exception("No network adapters with an IPv4 address in the system!");
}

当请求文件时,将检查文件是否在本地存储中。如果没有,则请求该文件并将其从服务器下载到本地存储中(这可行)。

如果文件位于本地存储中(或刚刚下载到本地存储中),则会使用文件流和response将其读回到HttpsListenerContext的{​​{1}}中:

Response.OutputStream.Write

在大多数情况下,此操作可以按预期工作,但是大约有5%的时间我出现错误 using (FileStream fileStream = new FileStream(ServerManager.persistentDataPath + fileName, FileMode.Open, FileAccess.Read)) { byte[] buffer = new byte[fileStream.Length]; fileStream.Read(buffer, 0, (int)fileStream.Length); context.Response.ContentLength64 = fileStream.Length; context.Response.ContentEncoding = Encoding.ASCII; context.Response.ContentType = "text/plain; charset=utf-8"; context.Response.AddHeader("Cache-Control", "no-cache"); context.Response.OutputStream.Write(buffer, 0, buffer.Length); }

这似乎是随机发生的,而不是在任何特定文件上或经过一定时间后发生。

我尝试摆弄System.IO.IOException: Unable to write data to the transport connection: Connection reset by peer. ---> System.Net.Sockets.SocketException: Connection reset by peer.之类的Response设置,并将KeepAlive = true设置为ProtocolVersion。但这并没有改变。

我在SO上找到了this的答案,这表明它可能被防火墙阻止了,但是由于它仅在偶然的情况下发生,并且遍及整个本地,因此在我看来这不太可能。或与目标机器(对等)的连接不可更改/关闭。但是我不确定如果全部在本地完成,那怎么会发生。

由于错误还包含HttpVersion.Version11,因此我尝试查看封装的---> System.Net.Sockets.SocketException: Connection reset by peer.中是否有任何SocketException,但这已通过并转到try/catch捕获。

我将Unity与.net 4.x api兼容级别和.net 4.x Eqvuialent脚本运行时版本一起使用。使用IL2CPP脚本后端。

最重要的构建目标是Android,这是最常见但并非唯一的情况。它也发生在Unity编辑器(2019)中,尽管频率较低

编辑:根据评论,我一直试图找出是否是超时问题。为此,我一直在记录处理时间,从结果来看,对我来说这似乎不太可能是因为超时。有时,完成请求通常比失败请求花费更长的时间。还是由套接字动态设置超时?

我尝试将TimeoutManager设置为允许更长的空闲时间,但是这样做时我得到了IOException。将OutputStream传递到NotImplementedException并设置System.UI.Stream会导致错误,告诉我当前流不支持writeTimeout。

0 个答案:

没有答案