socket异步接收很怪很怪的问题 本帖最后由 qiuqingpo 于 2010-08-27 11:36:14 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 同步发送试试;不太喜欢C#的socket,感觉用起来不爽; DealData(readbuffer);是干什么的?干嘛要先把数据复制到readbuffer多此一举? 跟你说点有用的吧!当网络很差(或者如你的测试压力)时,socket的缓冲区不一定有那么多数据。所以你可以补充以下简单的协议,例如每一个消息的最后必须是ascii码“sp1234”对应的这样6个字节。然后,当你的if (client.Available <= 0)判断内部,还要判断是否 state.buffer 恰好是这6个字节结尾,如果是才认为消息结束,当不符合的时候不要调用处理“信息包结束”的方法。这样可以避免错误调用这个方法。实际上,这段代码透露出你有滥用try...catch....的习惯。这样,明明是处理信息包时出现异常,也被你用来误导别人(和自己)说“没有收到信息包”。滥用try...catch....就会让调试和迅速定位问题变得异常困难,所以最好不要滥写try...catch.....,异常应该在应用系统的最高层(表现层,对于客户端就是application,对于服务就是通讯命令执行层)去捕获和统一处理,在深层不要滥用try...catch....。 private void ReceiveCallBack(IAsyncResult ar) { //从输入参数异步state对象中获取state和socket对象 StateObject state = (StateObject)ar.AsyncState; Socket client = state.worksocket; //从远程设备读取数据 int bytesRead = client.EndReceive(ar); if (bytesRead == 0) { Close(); return; } if (client.Available <= 0) { DealData(state.buffer); } client.BeginReceive(state.buffer, 0, StateObject.buffersize, 0, new AsyncCallback(ReceiveCallBack), state); } private void DealData(byte[] bytes) { if (bytes.Length >= 12) { byte[] buffer = null; buffer = new byte[12]; Buffer.BlockCopy(bytes, 0, buffer, 0, 12); MessageHeader head = new MessageHeader(buffer); int MsgLen = (int)head.Total_Length; if (bytes.Length >= MsgLen && MsgLen >= 12) { buffer = new byte[MsgLen]; Buffer.BlockCopy(bytes, 0, buffer, 0, MsgLen); Array.Clear(bytes, 0, MsgLen); ProcessMessageBytes(buffer,head); if (bytes.Length - MsgLen >= 12) { buffer = new byte[bytes.Length - MsgLen]; Buffer.BlockCopy(bytes, 0, buffer, 0, buffer.Length); DealData(buffer); } // Array.Clear(bytes, 0, bytes.Length); } else { // Array.Clear(bytes, 0, bytes.Length); } } else { //Array.Clear(bytes, 0, bytes.Length); } }把sp1234指点后的代码再贴出来.再次请求sp1234指点!再看一下DataDeal(bytes)的方法. 反射:用构造函数动态生成对象 求推荐C#进阶经典图书 急,急,急,在建oracle数据库低层时OracleCommand里为什么没CommandTimeout?? asp.net 如何实现 messgbox 如何在listview控件中使用复选框和文本框(希望在listview中编辑内容)? 又来提问了!关于XML 想对WebBrowser取得的网页进行过滤,需要哪些知识? 双缓冲的问题 为什么我的贴子无法在列表中找到,而只能在"我的贴子"中找到? 用户分组问题 VS2008 AJAX问题 不打开EXCEL文件读取数据
是干什么的?干嘛要先把数据复制到readbuffer多此一举?
private void ReceiveCallBack(IAsyncResult ar)
{
//从输入参数异步state对象中获取state和socket对象
StateObject state = (StateObject)ar.AsyncState;
Socket client = state.worksocket;
//从远程设备读取数据
int bytesRead = client.EndReceive(ar);
if (bytesRead == 0)
{
Close();
return;
}
if (client.Available <= 0)
{
DealData(state.buffer);
}
client.BeginReceive(state.buffer, 0, StateObject.buffersize, 0, new AsyncCallback(ReceiveCallBack), state);
}
private void DealData(byte[] bytes)
{
if (bytes.Length >= 12)
{
byte[] buffer = null;
buffer = new byte[12];
Buffer.BlockCopy(bytes, 0, buffer, 0, 12);
MessageHeader head = new MessageHeader(buffer);
int MsgLen = (int)head.Total_Length;
if (bytes.Length >= MsgLen && MsgLen >= 12)
{
buffer = new byte[MsgLen];
Buffer.BlockCopy(bytes, 0, buffer, 0, MsgLen);
Array.Clear(bytes, 0, MsgLen);
ProcessMessageBytes(buffer,head);
if (bytes.Length - MsgLen >= 12)
{
buffer = new byte[bytes.Length - MsgLen];
Buffer.BlockCopy(bytes, 0, buffer, 0, buffer.Length);
DealData(buffer);
}
// Array.Clear(bytes, 0, bytes.Length);
}
else
{
// Array.Clear(bytes, 0, bytes.Length);
}
}
else
{
//Array.Clear(bytes, 0, bytes.Length);
}
}把sp1234指点后的代码再贴出来.再次请求sp1234指点!再看一下DataDeal(bytes)的方法.