C# socket 异步接收 问题

tianchao123456 2015-05-25 05:56:49
各位大神:
C# 写的异步客户端的接收回调

public void readCallback(IAsyncResult ar) {
StateObject state = (StateObject) ar.AsyncState;
Socket handler = state.WorkSocket;
int read = handler.EndReceive(ar);
if (read > 0) {
state.sb.Append(Encoding.ASCII.GetString(state.buffer,0,read));
handler.BeginReceive(state.buffer,0,StateObject.BufferSize, 0,
new AsyncCallback(readCallback), state);
} else {
if (state.sb.Length > 1) {
string content = state.sb.ToString();
Console.WriteLine("Read {0} bytes from socket.\n Data : {1}",
content.Length, content);
}
}
}
问题如下:如果服务端发送过来的数据没有自定义的包头和包尾,长度不定,且缓冲区设置小于接收包长度,也就是需要再次或多次读取,怎么保证读取的数据完整和不重复?
求思路和方法,多谢指点感激不尽。
...全文
267 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
编程有钱人了 2015-06-04
  • 打赏
  • 举报
回复
引用 10 楼 tianchao123456 的回复:
[quote=引用 4 楼 wangjun8868 的回复:] TCP粘包解决 http://www.cnblogs.com/wangjun8868/p/4380187.html
学习了 粘包的思想是不是就是加头和尾,接收是进行逻辑判断?[/quote] 是这样的
tianchao123456 2015-06-04
  • 打赏
  • 举报
回复
引用 4 楼 wangjun8868 的回复:
TCP粘包解决 http://www.cnblogs.com/wangjun8868/p/4380187.html
学习了 粘包的思想是不是就是加头和尾,接收是进行逻辑判断?
tianchao123456 2015-06-04
  • 打赏
  • 举报
回复
引用 8 楼 Z65443344 的回复:
一个问题:分包我觉得应该是在客户端进行的 跟客户端还是服务端没有关系 你接收的时候就必须处理分包问题
是不是这样理解,分包不是“拆分”而是“分别”,就是接受时每次都对读过来的“包”进行判断,或留或丢弃
於黾 2015-06-04
  • 打赏
  • 举报
回复
一个问题:分包我觉得应该是在客户端进行的 跟客户端还是服务端没有关系 你接收的时候就必须处理分包问题
tianchao123456 2015-06-04
  • 打赏
  • 举报
回复
引用 3 楼 sp1234 的回复:
对于tcp来说,分包、粘包是最基本的概念,不要拿它来说什么“数据不完整”。你本来就应该学会分包读取数据。 tcp保证数据的次序正确,而且也不重复。用不着担心它“重复”。
受益匪浅。关于分包和粘包还请不吝赐教!
tianchao123456 2015-06-04
  • 打赏
  • 举报
回复
引用 2 楼 sp1234 的回复:
[quote=引用 楼主 tianchao123456 的回复:] 问题如下:如果服务端发送过来的数据没有自定义的包头和包尾,长度不定,且缓冲区设置小于接收包长度,也就是需要再次或多次读取,怎么保证读取的数据完整和不重复? 求思路和方法,多谢指点感激不尽。
首先有几个基本的知识错误。缓冲区大小跟接受完整不完整无关。假设对一次Send 8k字节内容,而你的缓冲区大小是128k,也完全可能分包啊。谁跟你说分包是因为你的应用程序的接受缓冲区设置的“小”而造成的呢? 另一个问题,你的原问题。所谓“发过来的数据”,如果就扔在你面前,请问你怎么识别消息?如果你连“人”都说不出怎么识别的规范,你想靠抄写别人的代码就告诉你如何识别你的数据?那么你这种学习方法也太奇葩了,而且也不会自己设计出任何实际的程序。(可是很多人偏偏就是靠瞎蒙、然后求人给写代码来进程程序设计的,而自己不把道理先说明白)[/quote] 感谢回复! 可能问题表述还是有一些不准确的地方。缓冲区大小跟接受完整不完整无关,这个知识点我还是知道的。之前比较疑惑的是如果客户端发送100字节,服务端缓冲区是20字节,那么readCallback就应该反复被调用直到没有数据,这里应该是取了5次。5次过后程序并没有走 if (read > 0) else{}的else块,难道是判断不对吗? 我的原问题,这位大哥说的很对,我都不知道规范和原数据就想要硬去处理,显然不太现实。 一个问题:分包我觉得应该是在客户端进行的,也就是给数据"包'加个“头”和“尾”以便处理?是这样吗?
tianchao123456 2015-06-04
  • 打赏
  • 举报
回复
引用 1 楼 bdmh 的回复:
自己给自己找麻烦,没有校验信息,只能让老天爷赐予你幸运吧,建议你改传输结构
通过验证问题中的那种结构确实不能正确处理,听人劝,吃饱饭,数据已按照已有协议传送
编程有钱人了 2015-05-25
  • 打赏
  • 举报
回复
  • 打赏
  • 举报
回复
对于tcp来说,分包、粘包是最基本的概念,不要拿它来说什么“数据不完整”。你本来就应该学会分包读取数据。 tcp保证数据的次序正确,而且也不重复。用不着担心它“重复”。
  • 打赏
  • 举报
回复
引用 楼主 tianchao123456 的回复:
问题如下:如果服务端发送过来的数据没有自定义的包头和包尾,长度不定,且缓冲区设置小于接收包长度,也就是需要再次或多次读取,怎么保证读取的数据完整和不重复? 求思路和方法,多谢指点感激不尽。
首先有几个基本的知识错误。缓冲区大小跟接受完整不完整无关。假设对一次Send 8k字节内容,而你的缓冲区大小是128k,也完全可能分包啊。谁跟你说分包是因为你的应用程序的接受缓冲区设置的“小”而造成的呢? 另一个问题,你的原问题。所谓“发过来的数据”,如果就扔在你面前,请问你怎么识别消息?如果你连“人”都说不出怎么识别的规范,你想靠抄写别人的代码就告诉你如何识别你的数据?那么你这种学习方法也太奇葩了,而且也不会自己设计出任何实际的程序。(可是很多人偏偏就是靠瞎蒙、然后求人给写代码来进程程序设计的,而自己不把道理先说明白)
bdmh 2015-05-25
  • 打赏
  • 举报
回复
自己给自己找麻烦,没有校验信息,只能让老天爷赐予你幸运吧,建议你改传输结构

110,533

社区成员

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

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

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