请教一个通讯问题(高手请进)

bobui 2010-04-06 05:44:28
下面的代码是使用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,也就是说在接收的时候连接中断了。
请问这个问题应该如何解决。

忘各位高手不吝赐教

...全文
253 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
xt218218 2010-04-08
  • 打赏
  • 举报
回复
帮顶 的
qiuqingpo 2010-04-08
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 bobui 的回复:]

两次比一次更清晰
[/Quote]
可是这样数据一多也会加重服务器的负担的.听说许多大的项目都是考虑把两个包一次发的,具体的我也不是太清楚了
bobui 2010-04-08
  • 打赏
  • 举报
回复
两次比一次更清晰
qiuqingpo 2010-04-08
  • 打赏
  • 举报
回复
一般消息头都应该固定长度的.收到后你截取一下就应该行了吧.就不用分两次吧!
qiuqingpo 2010-04-08
  • 打赏
  • 举报
回复
请问一下美女,你为什么要接收两次呀.接收一次不是更好一点啊!
littlegang 2010-04-08
  • 打赏
  • 举报
回复
重新去看下约定的协议,看是否服务器端要求你在收到数据后给出确认信息

感觉还是没有和协议一致的问题
qiuqingpo 2010-04-08
  • 打赏
  • 举报
回复
建议在try里加入
try
{
if(sock!=null&&sock.Connected)
{
//do something
}
}
catch
{
}
Aricc 2010-04-08
  • 打赏
  • 举报
回复
如果确实是连接断开了,你要判断连接状态及断开重连的机制。

另,Connected表示的不是链接的当前连接状态 。
详细信息看MSDN
jietuan 2010-04-08
  • 打赏
  • 举报
回复
这个问题,建议你使用异步调用。
shang123guan 2010-04-07
  • 打赏
  • 举报
回复
学习学习。。。
anguslaigz 2010-04-07
  • 打赏
  • 举报
回复
是不是,第一次还没有处理完,第二次双发冲死了,加个SELLP试一下吧
June1991 2010-04-07
  • 打赏
  • 举报
回复
学习学习。。。
tashiwoweiyi 2010-04-07
  • 打赏
  • 举报
回复
我不是高手。。进错了。帮顶
zhxingway 2010-04-07
  • 打赏
  • 举报
回复
帮顶,关注.呵呵.
bobui 2010-04-07
  • 打赏
  • 举报
回复
别沉了啊
LQknife 2010-04-07
  • 打赏
  • 举报
回复
连接超时了吧
看你代码里边没有判断recLen 为0的情况,如果为0了可能发送端已经关闭socket了
你这边接收端就没有用了
wenbin 2010-04-07
  • 打赏
  • 举报
回复
可能是你协议处理的有问题。
同步接收一个信息可以使用下面的方法。看着比你的简洁些:


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;
}
}
Alden 2010-04-07
  • 打赏
  • 举报
回复
这个代码看不出来,或许你其他地方有问题。
另外为什么你不用异步Socket接收数据。
nashina 2010-04-07
  • 打赏
  • 举报
回复
sock.Blocking = true;
为什么要用这个呢?

我用时如果一个包分两次取,就会经常出现这种问题;
但是一次取就没问题了;

然后在每次取完后做个判断,如果socket连接断开,就重新连
bobui 2010-04-07
  • 打赏
  • 举报
回复
不是我通过一次请求,服务器将发两次给我
第一次16字节
第二次260字节

另外可以肯定socket在接收时中断的,我断点测试过,在 sock.Blocking = true;
设置断点,条件时sock.Connectioned==false结果是并没有停下而自己进入了catch 里面
加载更多回复(7)

110,534

社区成员

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

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

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