C#==> Asyncsocket读缓冲区?

时间:2010-08-16 22:55:23

标签: c# sockets buffer

我有一个C#服务器,它接受多个客户端,以及来自每个客户端的多条消息。

1-为了从每个客户端开始读取,我需要传递一个缓冲区(字节),但问题是我不知道客户端要发送多少数据。那么有没有办法知道客户端要发送多少数据,以便我可以开始读取正确的数据量?

2-如果我只使用1字节数组从所有客户端读取,那么它是不是?或者我是否需要创建一个字节数组以便从每个客户端读取?

2 个答案:

答案 0 :(得分:2)

  1. 除非您的协议规定将发送多少数据,否则不会。通常,您会读取一个缓冲区值,然后可能会读取更多内容。但这确实取决于协议。如果客户端只能在每个连接上发送一条消息,那么通常会继续读取,直到下一次调用返回0字节。否则,消息都有分隔符或长度前缀。

  2. 绝对不是 - 假设您将同时从多个客户端读取(为什么还要使用异步通信?)您最终会将不同客户端的数据全部写在一起。为每个客户端创建一个新的字节数组。根据您对数据的确切操作,可能能够为同一客户端的下一次读取重用相同的字节数组 - 如果您真的想要,可以将字节数组重用于以后的客户端...但不要同时从多个客户端读取到同一个缓冲区。

答案 1 :(得分:0)

  

那么有没有办法知道客户端要发送多少数据,以便我可以开始读取正确的数据量?

任何协议都应该有一些机制让客户端指示何时完成发送数据,或者作为实际数据之前发送的“长度”值,或者作为特殊的终止序列在数据之后发送

  

如果我只使用1字节数组从所有客户端读取,那么它是不是?或者我是否需要创建一个字节数组以便从每个客户端读取?

取决于您的计划如何运作。如果你有多个并发客户端,显然你不能只有一个缓冲区,因为它们最终会相互覆盖。如果它是一个接一个的客户端,但一次只有一个,那么只有一个缓冲区没有问题。