Socket只能拿到包头信息,取不到包数据

Aderlee 2011-04-02 10:15:07
我写了个Socket服务端,接收收据,
 
while (true)
{
Socket temp = listener.Accept();
string recvStr = "";
byte[] recvBytes = new byte[1024];
int bytes;
bytes = temp.Receive(recvBytes, recvBytes.Length, 0);
recvStr += Encoding.GetEncoding("gbk").GetString(recvBytes, 0, bytes);

temp.Close();
}

但是只能拿到包头信息,取不到包数据。但是我用抓包的工具就能看到包的数据。怎么判断收据是否收齐呀?
...全文
209 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
Aderlee 2011-04-02
  • 打赏
  • 举报
回复
感谢楼上的,可以了。。
qldsrx 2011-04-02
  • 打赏
  • 举报
回复
用StringBuilder 代替string执行字符串拼接,可提高效率。
while (true)
{
Socket temp = listener.Accept();
StringBuilder recvStr = new StringBuilder();
byte[] recvBytes = new byte[1024];
int bytes;
do
{
bytes = temp.Receive(recvBytes, recvBytes.Length, 0);
recvStr.Append(Encoding.GetEncoding("gbk").GetString(recvBytes, 0, bytes));
}
while (bytes > 0);
temp.Close();
}
Aderlee 2011-04-02
  • 打赏
  • 举报
回复
有数据过来的,因为我抓包都能拿到,长度也是够的,但是很奇怪,我用上面的代码就只能拿到包头信息,偶尔能拿到包的数据,大多数情况下不成功。
bdmh 2011-04-02
  • 打赏
  • 举报
回复
有没有发报数据啊,一般的流程都是先发包头然后根据包头信息做事情,而且你的包头大小多少钱客户端发来多少啊
RRQMSocket是一个整合性的、超轻量级的网络通信服务框架。它具有高并发连接、高并发处理、事件订阅、插件式扩展、多线程处理、内存池、对象池等特点,让使用者能够更加简单的、快速的搭建网络框架。在发送效率上,同步发送可达20w/s,异步发送可达60w/s。服务器在接收、处理效率上因线程数量而定。 支持环境: .NETFramework4.5及以上。 .NETCore3.1及以上。 .NETStandard2.0及以上。 支持框架: WPF Winform Blazor Xamarin Mono Unity 其他(即所有C#系) 特点: 1、对象池 对象池在RRQMSocket有很多应用,最主要的两个就是连接对象池和处理对象池。连接对象池就是当客户端成功连接时,首先会去连接对象池中找TcpSocketClient,然后没有的话,才会创建。如果哪个客户端掉线了,它的TcpSocketClient就会被回收。这也就是ID重用的原因。 然后就是处理对象池,在RRQMSocket中,接收数据的线程和IOCP内核线程是分开的,也就是比如说客户端给服务器发送了1w条数据,但是服务器收到后处理起来很慢,那传统的iocp肯定会放慢接收速率,然后通知客户端的tcp窗口,发生拥塞,然后让客户端暂缓发送。但是在RRQMSocket中会把收到的数据通过队列全都存起来,首先不影响iocp的接收,同时再分配线程去处理收到的报文信息,这样就相当于一个“泄洪湖泊”,能很大程度的提高处理数据的能力。 2、多线程 由于有处理对象池的存在,使多线程处理变得简单。在客户端连接完成时,会自动分配该客户端辅助类(TcpSocketClient)的消息处理逻辑线程,假如服务器线程数量为10,则第一个连接的客户端会被分配到0号线程中,第二个连接将被分配到1号线程中,以此类推,循环分配。当某个客户端收到数据时,会将数据排入当前线程所独自拥有的队列当中,并唤醒线程执行。 3、传统IOCP和RRQMSocket RRQMSocket的IOCP和传统也不一样的,以微软官方为例,使用MemoryBuffer开辟一块内存,然后均分,然后给每个会话分配一个区接收,等收到数据以后,再复制一份,然后把复制的数据抛出处理。而RRQMSocket是每次接收之前,从内存池拿一个可用内存块,然后直接用于接收,等收到数据以后,直接就把这个内存块抛出去了,这样就避免了复制操作,虽然只是细小的设计,但是在传输1000w次64kb的数据时,性能相差了10倍。所以也是基于此,文件传输时效率才会高。 4、数据处理适配器 相信大家都使用过其他的Socket产品,例如HPSocket,SuperSocket等,那么RRQMSocket在设计时也是借鉴了其他产品的优秀设计理念,数据处理适配器就是其中之一,但和其他产品的设计不同的是,RRQMSocket的适配器功能更加强大,它可以无视真实的数据,而模拟出想要的数据,例如:可以对数据进行预处理,从而解决数据。粘的问题,也可以直接解析HTTP协议,经过适配器处理后传回一个HttpRequest对象等。 5、粘、分解决 在RRQMSocket中处理TCP粘、分问题是非常简单的。只需要更改不同的数据处理适配器即可。例如:使用固定,只需要给TcpSocketClient和TcpClient赋值FixedHeaderDataHandlingAdapter的实例即可。同样对应的处理器也有固定长度、终止字符分割等。

111,125

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧