我正在尝试实现一个网络应用协议客户端库,由 TCP 连接上的二进制请求/响应组成,我希望这个客户端完全异步,依赖于 c#5 的 async/await 结构。
在 NetworkStream 上发送的每个请求都包含一个关联的应用序列号。对请求的响应必须指定相同的序列号,以便响应与原始请求匹配。当我发出请求 R1 时,对 R1 的响应当然可以在将来的任何时间到来,而对其他请求的其他响应可能会在对 R1 的实际响应之前上线。
我想在库的客户端代码中做的是简单愚蠢的事情
var resp = await SendSomeRequestAsync(req);
SendSomeRequestAsync 将在线上异步发送请求(正确处理该部分)并以某种方式等待相关响应(与请求中发送的序列号匹配),例如(在 SendSomeRequestAsync 中)
var dummy = await _ns.WriteAsync(rawBytes, 0, rawBytes.Length); // _ns is a NetworkStream
var resp = await GetResponseMatchingSequenceNumberAsync(sequenceNumber);
我有一个循环在客户端启动连接时启动,该连接正在异步读取连接上的传入响应:
while (true)
{
Response rsp = await ReadNextResponseAsync(_ns);
DispatchReceivedResponse(rsp);
}
我不知道如何实现 GetResponseMatchingSequenceNumberAsync,或者我是否已经完全错了。
希望我的问题足够清楚。
谢谢