关于C# Socket的问题:最近用了一个ZYSocket 的东西,服务端接受数据不完整,求教,急

在判断数据是否完整的时候我用了下面的语句if(read.ReadInt32(outlength)&&read.ReadInt32(outcmd)&&length==rea... 在判断数据是否完整的时候我用了下面的语句if (read.ReadInt32(out length) && read.ReadInt32(out cmd) && length == read.Length),结果发现length == read.Length为false,length特别大,而read.Length却只有几十,是怎么回事? 展开
 我来答
luyikk
2012-12-22
知道答主
回答量:1
采纳率:0%
帮助的人:1556
展开全部
还是我本人来回答你吧,呵呵。 我定义的数据包 头上有4个字节(不包括V2) 是用来存储数据包长度的。 所以 read.ReadInt32(out length) 然后 比较 此长度和 读取到的数据包长度是否一致。
此代码在方法DataOn 里面 在调用DataOn 的地方。是数据包缓存整理器。 由于你发送的数据包经过网络后,会变成零零碎碎的数据包 到达服务器,所以 必须要使用 数据包缓存整理器 来确保读取到的数据包的正确性,你这里 如果读到的lengt 特别大,那么就是没用 使用 数据包缓存整理器

使用例子:

/// <summary>
/// 数据包输入
/// </summary>
/// <param name="data">输入数据</param>
/// <param name="socketAsync">该数据包的通讯SOCKET</param>
static void BinaryInputHandler(byte[] data, SocketAsyncEventArgs socketAsync)
{

if (socketAsync.UserToken == null) //如果此SOCKET绑定的对象为NULL
{
//注意这里为了 简单 所以就绑定了个 ZYNetBufferReadStream 类,本来这里应该绑定用户类对象,
//并在用户类里面建立 初始化 一个 ZYNetBufferReadStream 类,这样就能通过用户类保存更多的信息了。
//比如用户名,权限等等

socketAsync.UserToken = new ZYNetBufferReadStream(409600); }

ZYNetBufferReadStream buff = socketAsync.UserToken as ZYNetBufferReadStream;
buff.Write(data);

byte[] pdata;
while (buff.Read(out pdata))
{
DataOn(pdata, socketAsync);
}

}
聊无无
2012-02-23 · TA获得超过1206个赞
知道小有建树答主
回答量:186
采纳率:0%
帮助的人:219万
展开全部
不太清楚你这个ZYsocket是个啥。但是如果我没猜错。
length是代表socket.read后所从缓冲区中读出的数据
而socket.length则是缓冲区中剩余的数据
那么length和socket.Length基本是不可能相等的。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式