如何知道流已经结束C#
我想在C#中接收一个tcp数据包,但我不知道什么时候可以停止从流中读取数据。 这是我已经试过:如何知道流已经结束C#
for(int i = 0; i < stm.Length; i += chunkSize)
{
bb = new byte[chunkSize];
k = stm.Read(bb, 0, bb.Length);
ns.Write(bb, 0, k);
}
但它扔我一个错误关于该流为不可搜索。 所以我试过这个:
int k = chunkSize;
while (k == chunkSize)
{
bb = new byte[chunkSize];
k = stm.Read(bb, 0, bb.Length);
ns.Write(bb, 0, k);
}
有什么关系吗? 谢谢:)
这里,我们去:
int read;
while((read = stm.Read(bb, 0, bb.Length)) > 0) {
// process "read"-many bytes from bb
ns.Write(bb, 0, read);
}
“读”将仅在流的末尾,不积极在流的末尾,和。
或者更简单(4.0):
stm.CopyTo(ns);
问题是,如果没有东西可读,代码就会在Read方法上冻结。我猜这是超时或什么的,但是我不认为这是正确的解决方案,要等到每个数据包结束时超时为止 – 2012-02-27 18:02:13
@ JohnSmith然后,您需要使用Select()之类的内容来确定是否有数据可供读取。 – itsme86 2012-02-27 18:03:37
@约翰是的,你刚刚完美地描述了阅读的行为。如果你不想这样做,你必须使用其中一个异步API,并且有时在发送套接字 – 2012-02-27 18:04:19
一个二进制读取是你需要什么,因为它知道到底有多少字节读取!
它前缀字节的长度,所以它知道多少读!
一个二进制阅读器只能在几个非常特定的场景中做到这一点,如果该协议是在其他地方定义的,那么它就毫无用处。坦率地说,我做了很多通信/协议/序列化/等代码,并且我完全不会使用BinaryReader。 – 2012-02-27 18:06:53
哈哈哈....我知道我错了... thxx为你的信息.. ,但它不是有助于阅读字符串.. – Anirudha 2012-02-27 18:10:02
我没有说“错” - 只是...过度热心或许。对于字符串:同样,这是否有用取决于有线协议如何存储它们。例如,这个星期我一直在写WebSocket制作器;有(基本上)2个WebSocket协议和两个处理字符串 - 这对他们中的任何一个都没有帮助。它也不会帮助在redis协议或protobuf协议等字符串... – 2012-02-27 18:12:39
为什么你不是Google的“如何从C#中的TCP流读取”?必须有1000多种解释。 – usr 2012-02-27 17:58:02
我相信设置k等于chunkSize可能会有问题。看看stream.Read()返回的是什么。它并不总是等于你所期望的。 – Jason 2012-02-27 17:59:55