UWP Socket.InputStream.ReadAsync挂起

时间:2017-10-19 02:58:53

标签: sockets uwp

我遇到了UWP问题。我试图绑定一个StreamSocketListener作为一个小型Web服务器,但在20个左右的连接后,ReadAsync函数挂起,应用程序最终关闭而没有错误。

以下是我正在使用的代码:

private const uint bufferSize = 1024;
private int port = 9000;
public async void Start()
    {
        StreamSocketListener listener = new StreamSocketListener();


        listener.ConnectionReceived += async (sender, args) =>
        {
            string request = null;

            using (IInputStream input = args.Socket.InputStream)
            {
                byte[] data = new byte[bufferSize];
                IBuffer buffer = data.AsBuffer();
                uint bytesRead = bufferSize;

                while (bytesRead == bufferSize)
                {
                    IBuffer result = await input.ReadAsync(buffer, bufferSize, InputStreamOptions.Partial);
                    request += Encoding.ASCII.GetString(result.ToArray());
                    bytesRead = buffer.Length;
                }

                processRequest(getPath(request), args.Socket.OutputStream);
            }
        };

        await listener.BindServiceNameAsync(port.ToString());
    }

2 个答案:

答案 0 :(得分:0)

您最好及时处理废弃的连接。当您的应用收到新连接时,您可以在其ConnectionReceived事件处理程序中释放先前的连接。您可以看到官方代码示例也做同样的事情。 SocketActivityStreamSocket/cs/Server

答案 1 :(得分:0)

我在我的Raspberry Pi 3上使用类似的代码(我在网上找到它)作为一个简单的Web服务器,是的..它非常沮丧。实际上,我遇到了同样的问题,我在每个请求上都使用了“args.Socket.Dispose()”来解决问题的一部分。

我有一个Windows服务客户端每隔30秒连接到我的Pi简单Web服务器,我的Pi后台服务在大约1.5到2小时后挂起。经过多个小时的调试后,我尝试从input.ReadSync中删除“await”,同时确保您的ProcessRequest不执行任何异步/等待。它解决了我的问题,服务器变得稳定而不会挂起。对我来说没关系,因为我只有一个客户端,所以Sync或Async对我来说并不重要。

虽然有一个奇怪的问题......它似乎在白天随机,“请求”字符串将收到一些垃圾,而不是真正的HTTP请求。我还是没弄明白为什么。 BTW,在GitHub上有一个非常好的开源项目名为“Catnap.Server”,看起来看起来非常强大。我没有尝试过,但是如果你看一下这个实现,他们就会使用Streamreader而不是ReadAsync。

当我的Windows服务客户端连接到我在旧版本的Raspberry Pi上运行时,它已经运行了3年,该版本运行在NOOBS linux,Apache和PHP上。它坚如磐石稳定......只想试试Win 10 IoT,我们必须实现自己的网络服务器!! ???到目前为止,我的经历并不是那么令人愉快。