关于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却只有几十,是怎么回事?
展开
2个回答
展开全部
还是我本人来回答你吧,呵呵。 我定义的数据包 头上有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);
}
}
此代码在方法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);
}
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询