连接超时,请问能不能模拟服务端发给客户端数据包?可行吗?

rabolee 2003-10-09 12:46:06
请问能不能模拟服务端发给客户端数据包?就是自己让自己RECV。

我现在的客户端程序,和服务端TCP通信,不是UDP。
比如说网络出现延迟,服务端就不能发数据发到我客户端了。
这样他们之间的连接就会中断。
我现在要实现这样:
如果没有收到服务商的数据的时间超过一个值。
就调用PassTime()自己让自己RECV一个。
void PassTime()
{
char realData[] = {(char)0xa6,};
char *buf;
buf=realData;
recv(s, (char *)buf, sizeof(buf), NULL);
}
我试了一下,没有成功,没有反应。不知道是方向错误还是方法错误。
如果不能自己让自己RECV,能不能模拟客户端给我客户端发一个包呢?
...全文
76 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
rabolee 2003-10-09
  • 打赏
  • 举报
回复
客户端也是我写的啊!我也可以用相同的方法来RECV一个啊。

所以如果网络连接成功了,应该也可以恢复工作啊

还有,我直接用recv不能达到这个效果吗?那怎么办?还有办法吗?

只要能让客户端收到一个包。
_xiao 2003-10-09
  • 打赏
  • 举报
回复
没有意义,即使你的想法成功,欺骗了你本机的tcp连接,没有断开,但对方的tcp连接也会由于超时而断开,网络再次成功后该tcp连接也无法恢复工作。

再说你使用recv根本无法达到你所说的效果。
_xiao 2003-10-09
  • 打赏
  • 举报
回复
TCP连接的某端不会因为很长时间接受不到数据而主动去断开连接,因为我们通常都没有使用保活定时器(KeepAlive选项),因此不用担心某端因为长时间接受不到数据而断开连接,连接的断开通常是因为重传失败而导致的。

TCP在网络传输失败后会自动进行重传,从最后一次发送数据到最后重传失败而放弃这段时间约在10分钟左右,如果你的程序间数据通信经过了10分钟的尝试都没有1个字节传输成功,那么你还保持着这个连接有什么用?另外看了一下资料,好像这个放弃时间一般都不提供修改。

另外,要欺骗tcp连接也是一件很麻烦的事情,它的两方都各自保存着发送序号SN和接收序号RN,是双方在连接时协商好的两个随机数,客户端的RN与服务器段的SN相对应,如果你欺骗了客户端,发送了一包数据给客户端,那么其RN将会改变,从而不再与服务器的SN相对应,连接恢复后就会导致服务器端发送数据的丢失或整个连接序号紊乱而出错,同样如果是在数据重传中你给客户端发送一个ACK使得客户端认为该数据包已发送成功,那么这个数据包就会由于服务器端并没有实际收到而丢失。

所以不建议你使用模拟方法来欺骗tcp连接,而应该在发送数据时检查函数返回值,如果是由于网络拥挤超时导致连接中断,则应重新建立连接再传数据(从来没碰到过这种网络繁忙到使连接中断的情况,怀疑是你程序处理错误而导致的连接主动关闭)。

另外如果真要欺骗tcp连接防止其重传失败断开,还有一个变通的办法,就是在重传次数达到一定的次数后(如何得到重传次数?还没想过),主动清空tcp的发送缓冲区(好像有这个功能的函数的),这样会使未发送的数据丢失,但可以让连接的双方安静下来,等度过网络繁忙期后再重新传输数据(前面说过,在双方未使用保活定时器时如果互不传输数据的话,这个连接是可以安全地永久保持的)。
rabolee 2003-10-09
  • 打赏
  • 举报
回复
顶!

18,355

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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