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

2024-12-18 11:49:12
推荐回答(2个)
回答1:

还是我本人来回答你吧,呵呵。 我定义的数据包 头上有4个字节(不包括V2) 是用来存储数据包长度的。 所以 read.ReadInt32(out length) 然后 比较 此长度和 读取到的数据包长度是否一致。
此代码在方法DataOn 里面 在调用DataOn 的地方。是数据包缓存整理器。 由于你发送的数据包经过网络后,会变成零零碎碎的数据包 到达服务器,所以 必须要使用 数据包缓存整理器 来确保读取到的数据包的正确性,你这里 如果读到的lengt 特别大,那么就是没用 使用 数据包缓存整理器

使用例子:

///


/// 数据包输入
///

/// 输入数据
/// 该数据包的通讯SOCKET
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);
}

}

回答2:

不太清楚你这个ZYsocket是个啥。但是如果我没猜错。
length是代表socket.read后所从缓冲区中读出的数据
而socket.length则是缓冲区中剩余的数据
那么length和socket.Length基本是不可能相等的。