socket异步接收

sunrain_leo 2004-10-30 03:49:59
public static void ReadCallback(IAsyncResult objIAsyncResult)
{
StateObject objStateObject = (StateObject)objIAsyncResult.AsyncState;
Socket objSocketHandler = objStateObject.objSocketWork;
string strIP = objSocketHandler.RemoteEndPoint.ToString();
int intBytesRead = objSocketHandler.EndReceive(objIAsyncResult);

if(intBytesRead > 0)
{
string strTemp = "";
byte[] btReceive = new byte[intBytesRead];
for(int i=0;i<intBytesRead;i++)
{
btReceive[i] = objStateObject.btBuffer[i];
/// 一定要转换位16进制的
strTemp += btReceive[i].ToString("0X");
}
/// 解析数据包内容
PackUnpackData.clsPackUnpackData.ddrDealData(objSocketHandler,strTemp);

objSocketHandler.BeginReceive(objStateObject.btBuffer,0,StateObject.intBufferSize,0,new AsyncCallback(ReadCallback),objStateObject);
}
}
对于以上,如果数据包长度过大,缓冲区只设置位512,并且数据包设置起始符和终止符,如何接收一条完整的数据之后再对数据包进行整体处理

例如:
数据包格式:AAAA……BBBB,长度大于512
当收到完整的数据AAAA……BBBB之后再将其送到其他函数中进行处理

问:这样的情况会不会出现(缓冲区收到前512个字节后,再此收到剩余的之后,新的数据包紧跟着剩余数据包,如下……BBBBAAAA……)?
如出现应该如何处理
...全文
183 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaoslong 2004-10-30
  • 打赏
  • 举报
回复
up
catman3000 2004-10-30
  • 打赏
  • 举报
回复
当然是一个主监听线程listen,连接到后,马上把该连接放在另外的线程中去处理,这样做是为了不让监听线程中断。至于是否每个连接都开一个新的线程,也不一定,可以用异步的方法,在一个新的线程中处理所有连接。
catman3000 2004-10-30
  • 打赏
  • 举报
回复
我觉得应该在数据包前,写明当前包的大小,否则不是有的等了?或者用结束符号,自己定义一个特殊结束符串。另外开始接收到数据时计时,超过时间还没有达到预期的结束,可以认为出错了。
sunrain_leo 2004-10-30
  • 打赏
  • 举报
回复
是不是异步接收可以这样简单认为:
当主监听程序监听到一个连接后,即为其建立一个连接线程,并可以声明一个特定的缓冲区来保存此数据;
当有三个不同连接先后连接到服务器后,主监听相当于开启3个独立的线程对每一个连接进行处理,这样连接和连接之间的数据包是不会相互干扰的(即不会出现……BBBBAAAA……,或AAAA……BBBBAAAA……的情况)

请各位大老指点撒!!!!!!!!!!!!?????????????????
佣工7001 2004-10-30
  • 打赏
  • 举报
回复
关注。。。。。。。。。。。

110,534

社区成员

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

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

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