gpt4 book ai didi

C# Http服务器使用StreamSocketListener,选项 "InputStreamOptions.Partial"返回数据不完整

转载 作者:可可西里 更新时间:2023-11-01 02:42:35 25 4
gpt4 key购买 nike

首先,我正在处理一个 Windows 通用应用程序项目。我使用 StreamSocketListener 创建了一个简单的 tcp 监听器。数据来自连接到本地网络的设备。本设备随机发送Http、Http/Xml包。

我已经创建了套接字监听器,如下所示:

StreamSocketListener listener = new StreamSocketListener();

public async void HttpServer()
{
listener.ConnectionReceived += (s, e) => ProcessRequestAsync(e.Socket);
HostName hostName = new HostName("192.168.0.150");
NetworkAdapter thisAdapter = hostName.IPInformation.NetworkAdapter;
await listener.BindServiceNameAsync("5400", SocketProtectionLevel.PlainSocket, thisAdapter);
}

这是数据可用时的回调函数:

private const uint BufferSize = 12000;

private async void ProcessRequestAsync(StreamSocket socket)
{

StringBuilder request = new StringBuilder();

using (IInputStream input = socket.InputStream)
{
byte[] data = new byte[BufferSize];
IBuffer buffer = data.AsBuffer();
uint dataRead = BufferSize;
while (dataRead == BufferSize)
{
await input.ReadAsync(buffer, BufferSize, InputStreamOptions.None);
request.Append(Encoding.UTF8.GetString(data, 0, (Int32)buffer.Length));
dataRead = buffer.Length;
}

String message = request.ToString();

ExampleTextLabel.Text = message;

....

}

问题是:

我设置了 BufferSize = 12000。这是因为,到目前为止,我收到的最大数据长度低于 11500。内容的长度在 HTML header (CONTENT-LENGTH) 中,但我不确定如何阅读行前的标题:

await input.ReadAsync(buffer, BufferSize, InputStreamOptions.None);

当我使用选项 InputStreamOptions.None 时,我收到的消息延迟了一个数据包。换句话说,当设备发出数据包1时,它不会将其写入以下文本标签:

ExampleTextLabel.Text = message;

当数据包 2 到达时,ExampleTextLabel 显示来自数据包 1 的消息。我知道这一点是因为我正在使用 Wireshark 观察传入的数据包。

另一方面,如果我使用选项 InputStreamOptions.Partial,则没有延迟。我收到了 Wireshark 中显示的数据包。然而,此解决方案的问题是大多数时候数据包已损坏(不完整)。

谁能解释一下这里的问题,是否有任何解决方案?

谢谢!

最佳答案

回答我的问题,

InputStreamOptions.Partial 是一种异步读取操作,当一个或多个字节可用时完成。

这意味着有时它会在没有完成数据包的情况下结束读取操作。我对上面的代码做了以下更改以使其正常工作(不是实际代码,只是评论以提供想法):

while (allDataRead)
{
await input.ReadAsync(buffer, BufferSize, InputStreamOptions.None);
request.Append(Encoding.UTF8.GetString(data, 0, (Int32)buffer.Length));
dataRead = buffer.Length;

//make sure the data read contains the html header, otherwise loop again
//until you can extract the HTML header.
//Get the content length from the HTTP header.

//If the buffer size does not match the content length + html header length,
//then loop again to get the remaining packets until the buffer length
//matches the content length + html header length

//If the content length matches the buffer length then you have received the packet completely.
//allDataRead=true to exit the loop.

}

关于C# Http服务器使用StreamSocketListener,选项 "InputStreamOptions.Partial"返回数据不完整,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32297416/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com