C# Socket TCP 心跳 不明白原来有资料的给发个看看?

gzxchaoren 2012-10-25 02:40:29
我的服务器设置了连接超时,我做的是长连接 但是如果客户端不发送数据 服务器就会报错
错误:由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。
也就是说超时了。
在网上找的资料说需要心跳设置,不清楚心跳是什么意思?求大侠解说下,最好有代码。我的服务器和客户端通信通信没问题就是需要长连接
...全文
639 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
gzxchaoren 2012-10-25
  • 打赏
  • 举报
回复
没人关注啊
gzxchaoren 2012-10-25
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]

长连接心跳包一定要的。
心跳包与楼主的错误有一定的关系。

网络通信需要协议。心跳包就是协议中的一个。
一般需要频繁数据通信的。心跳包可以免了。
比如一般的在线监测系统。因为过于频繁相当于心跳包使用了。
[/Quote]
我现在基本上理解了,还有一个问题 就是 我设置了 超时时间 是不是 心跳包有没有 客户不发送内容 都会报错?
足球中国 2012-10-25
  • 打赏
  • 举报
回复
长连接心跳包一定要的。
心跳包与楼主的错误有一定的关系。

网络通信需要协议。心跳包就是协议中的一个。
一般需要频繁数据通信的。心跳包可以免了。
比如一般的在线监测系统。因为过于频繁相当于心跳包使用了。
gzxchaoren 2012-10-25
  • 打赏
  • 举报
回复
我在网上找的心跳代码
声明

private byte[] KeepAliveTime
{
get
{
uint dummy = 0;
byte[] inOptionValues = new byte[Marshal.SizeOf(dummy) * 3];
BitConverter.GetBytes((uint)1).CopyTo(inOptionValues, 0);
BitConverter.GetBytes((uint)5000).CopyTo(inOptionValues, Marshal.SizeOf(dummy));
BitConverter.GetBytes((uint)5000).CopyTo(inOptionValues, Marshal.SizeOf(dummy) * 2);
return inOptionValues;
}
}
private int keepAlive = -1744830460;
private byte[] inValue = new byte[] { 1, 0, 0, 0, 0x20, 0x4e, 0, 0, 0xd0, 0x07, 0, 0 };

使用

SocketClient.IOControl(keepAlive, inValue, null);
SocketClient.IOControl(IOControlCode.KeepAliveValues, KeepAliveTime, null);
SocketClient.Connect(ipenpointServer);

但是 设置超时时间
还是会报错:由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。
不过 不设置超时时间 如果我关闭客户端 他会提示:远程主机强迫关闭了一个现有的连接。
如果吧 心跳代码去掉,吧超时时间也去掉,关闭客户端,服务器 什么也不报错。
这样是不是就算是完成了?
gzxchaoren 2012-10-25
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

“错误:由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。”
这说明连接都没成功的。
连接成功后,只要没有设置接收超时时间,Socket会一直处于接收阻止状态等待下一帧数据,所以要不要心跳包无所谓
[/Quote]
我设置超时时间了
Pigeon汪 2012-10-25
  • 打赏
  • 举报
回复
“错误:由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。”
这说明连接都没成功的。
连接成功后,只要没有设置接收超时时间,Socket会一直处于接收阻止状态等待下一帧数据,所以要不要心跳包无所谓
烈火蜓蜻 2012-10-25
  • 打赏
  • 举报
回复
服务端收到之后,再应答给客户端一下,那样客户端就知道,心跳成功了,然后又等一段时间。再次操作
烈火蜓蜻 2012-10-25
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

就是没有用的数据包了,当成心跳包用,

让连接知道还有数据在传输就不会断开了
[/Quote]

客户端每隔一小段时间就给服务端发送一个没用的数据包,这样的包做用就是用来保持连接的,这就叫心跳包了
gzxchaoren 2012-10-25
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

就是没有用的数据包了,当成心跳包用,

让连接知道还有数据在传输就不会断开了
[/Quote]
具体怎么操作呢?
烈火蜓蜻 2012-10-25
  • 打赏
  • 举报
回复
就是没有用的数据包了,当成心跳包用,

让连接知道还有数据在传输就不会断开了

111,094

社区成员

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

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

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