2012-02-27 165 views
1

我想在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); 
} 

有什么关系吗? 谢谢:)

+0

为什么你不是Google的“如何从C#中的TCP流读取”?必须有1000多种解释。 – usr 2012-02-27 17:58:02

+0

我相信设置k等于chunkSize可能会有问题。看看stream.Read()返回的是什么。它并不总是等于你所期望的。 – Jason 2012-02-27 17:59:55

回答

4

这里,我们去:

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); 
+0

问题是,如果没有东西可读,代码就会在Read方法上冻结。我猜这是超时或什么的,但是我不认为这是正确的解决方案,要等到每个数据包结束时超时为止 – 2012-02-27 18:02:13

+0

@ JohnSmith然后,您需要使用Select()之类的内容来确定是否有数据可供读取。 – itsme86 2012-02-27 18:03:37

+0

@约翰是的,你刚刚完美地描述了阅读的行为。如果你不想这样做,你必须使用其中一个异步API,并且有时在发送套接字 – 2012-02-27 18:04:19

1

一个二进制读取是你需要什么,因为它知道到底有多少字节读取!

它前缀字节的长度,所以它知道多少读!

+0

一个二进制阅读器只能在几个非常特定的场景中做到这一点,如果该协议是在其他地方定义的,那么它就毫无用处。坦率地说,我做了很多通信/协议/序列化/等代码,并且我完全不会使用BinaryReader。 – 2012-02-27 18:06:53

+0

哈哈哈....我知道我错了... thxx为你的信息.. ,但它不是有助于阅读字符串.. – Anirudha 2012-02-27 18:10:02

+0

我没有说“错” - 只是...过度热心或许。对于字符串:同样,这是否有用取决于有线协议如何存储它们。例如,这个星期我一直在写WebSocket制作器;有(基本上)2个WebSocket协议和两个处理字符串 - 这对他们中的任何一个都没有帮助。它也不会帮助在redis协议或protobuf协议等字符串... – 2012-02-27 18:12:39

相关问题