下面的代码是使用socket通讯接收来自服务器发送的信息
我的程序的通讯原理是:
1.发送请求1
2.发送请求2
. ...
N。发送请求N
然后是接收
下面是接收代码(所有的接收的信息采用的是接收两次)
数据头:16byte
数据体:260byte,
总是 数据头+数据体的方式接收。 public bool SafeRecvData(Socket sock, ref byte[] buff, int nLen)
{
try
{
int recLen = 0;
int tmpLen = 0;
while (tmpLen < nLen)
{
byte[] btmp = new byte[nLen - tmpLen];
sock.Blocking = true;
try
{
recLen = sock.Receive(btmp);
}
catch (Exception ex)
{
string s = ex.Message;//报错位置
}
tmpLen = tmpLen + recLen;
for (int i = tmpLen - recLen; i < tmpLen; i++)
{
buff[i] = btmp[i - tmpLen + recLen];
}
}
}
catch (Exception ex)
{
IOHelper.WriteLog("接收行情错误(错误类型1):" + ex.Message);
return false;
}
return true;
}
上面的代码在程序开启的前几秒钟没有任何问题,几秒钟以后报错。
捕获的错误是:由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。
查看sock的Connected属性,发现Connected为false,也就是说在接收的时候连接中断了。
请问这个问题应该如何解决。忘各位高手不吝赐教
我的程序的通讯原理是:
1.发送请求1
2.发送请求2
. ...
N。发送请求N
然后是接收
下面是接收代码(所有的接收的信息采用的是接收两次)
数据头:16byte
数据体:260byte,
总是 数据头+数据体的方式接收。 public bool SafeRecvData(Socket sock, ref byte[] buff, int nLen)
{
try
{
int recLen = 0;
int tmpLen = 0;
while (tmpLen < nLen)
{
byte[] btmp = new byte[nLen - tmpLen];
sock.Blocking = true;
try
{
recLen = sock.Receive(btmp);
}
catch (Exception ex)
{
string s = ex.Message;//报错位置
}
tmpLen = tmpLen + recLen;
for (int i = tmpLen - recLen; i < tmpLen; i++)
{
buff[i] = btmp[i - tmpLen + recLen];
}
}
}
catch (Exception ex)
{
IOHelper.WriteLog("接收行情错误(错误类型1):" + ex.Message);
return false;
}
return true;
}
上面的代码在程序开启的前几秒钟没有任何问题,几秒钟以后报错。
捕获的错误是:由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。
查看sock的Connected属性,发现Connected为false,也就是说在接收的时候连接中断了。
请问这个问题应该如何解决。忘各位高手不吝赐教
解决方案 »
- C#中有没有类似delphi TStrings.AddObject的类
- 一个关与windows服务程序,"允许服务与桌面交互"的问题.我都弄了几天了也没弄明白大家帮帮忙吧.谢了.
- 求救大家一个关于mshtml的问题
- 问个一般问题,在VC#开发环境中如果有.......
- 关于Datagrid:焦点落在Datagrid的时候填充数据会出错!!!
- 求助啊啊 !!大神们
- 怎么写出类似关键字前景色不同的编辑器
- 如何实现类似VS的属性页功能?
- 怎样做一个网页编辑器(windows form)大家给个思路
- C# Winform自定义控件改变背景颜色问题(MouseEnter Leave事件)
- 怎样实现查询的功能 刚刚学C#者
- 关于正则表达式的问题
http://topic.csdn.net/u/20090922/14/790c0084-0849-420d-8593-6eeeab57286d.html
另外nLen你确定每次都是276?
第一次16字节
第二次260字节另外可以肯定socket在接收时中断的,我断点测试过,在 sock.Blocking = true;
设置断点,条件时sock.Connectioned==false结果是并没有停下而自己进入了catch 里面
为什么要用这个呢?我用时如果一个包分两次取,就会经常出现这种问题;
但是一次取就没问题了;然后在每次取完后做个判断,如果socket连接断开,就重新连
另外为什么你不用异步Socket接收数据。
同步接收一个信息可以使用下面的方法。看着比你的简洁些:
void ReceiveVarData(int packageLength, Socket sock, byte[] recBuffer) {
if (_isClosed) return;
int total = 0;
int recv = 0; int dataleft = packageLength;
SocketError sError;
while (total < packageLength) { recv = sock.Receive(recBuffer, total, dataleft, SocketFlags.None, out sError);
//
//这部分是处理断线的情况。
//
if (!CheckRecSocketError(recv, sError)) {
Close();
return;
}
total += recv;
dataleft -= recv;
}
}
看你代码里边没有判断recLen 为0的情况,如果为0了可能发送端已经关闭socket了
你这边接收端就没有用了
详细信息看MSDN
try
{
if(sock!=null&&sock.Connected)
{
//do something
}
}
catch
{
}