网络通信中的心跳机制的实现!

简介:
有开发网络应用经历的人都知道,网络中的接收和发送数据都是使用WINDOWS中的SOCKET进行实现。但是如果此套接字已经断开,那发送数据和接收数据的时候就一定会有问题。可是如何判断这个套接字是否还可以使用呢?
  有人一定想到使用Send函数中的返回结果来进行判断。如果返回的长度和自己发送出去的长度一致,那就说明这个套接字是可用的,否则此套接字一定出现了问题。但是我们并不是无时无刻的发送数据呀。如何解决呢?
  其实TCP中已经为我们实现了一个叫做 心跳的机制 。如果你设置了心跳,那TCP就会在一定的时间(比如你设置的是3秒钟)内发送你设置的次数的心跳(比如说2次),并且此信息不会影响你自己定义的协议。
  在VC中实现心跳的例子很多,可是在DLEPHI中一直没有相应的代码。下面我是我使用DELPHI编写的关于 心跳的代码 (以IOCP为例),希望对大家有帮助。
定义心跳常量
const
  IOC_IN               =$80000000;
  IOC_VENDOR           =$18000000;
  IOC_out              =$40000000;
  SIO_KEEPALIVE_VALS   =IOC_IN or IOC_VENDOR or 4;
var
  inKeepAlive,OutKeepAlive:TTCP_KEEPALIVE;
实现代码是在Acceptsc:= WSAAccept(Listensc, nil, nil, nil, 0);代码的后面加入:
      opt:=1;
      if setsockopt(Acceptsc,SOL_SOCKET,SO_KEEPALIVE,@opt,sizeof(opt))=SOCKET_ERROR then
      begin
        closesocket(Acceptsc);
      end;
      inKeepAlive.onoff:=1;
      //设置3秒钟时间间隔
  inKeepAlive.keepalivetime:=3000;
      //设置每3秒中发送1次的心跳
      inKeepAlive.keepaliveinterval:=1;
      insize:=sizeof(TTCP_KEEPALIVE);
      outsize:=sizeof(TTCP_KEEPALIVE);
      if WSAIoctl(Accept,SIO_KEEPALIVE_VALS,@inKeepAlive,insize,@outKeepAlive,outsize,@outByte,nil,nil)=SOCKET_ERROR then
      begin
        closesocket(Acceptsc);
      end;
如果加入以上的代码以后,系统会每3秒中加入一次的心跳。并且如果客户端断线以后(网线断),函数GetQueuedCompletionStatus会返回FALSE。
if (GetQueuedCompletionStatus(CompletionPort, BytesTransferred,DWORD(PerHandleData), POverlapped(PerIoData), INFINITE) = False) then
        begin
           //在这里处理客户端断线信息。
   continue;
        end;
以上就是我使用心跳的方法,此方法我已经在我的网络游戏中使用。情况稳定!
本文转自狗窝博客51CTO博客,原文链接http://blog.51cto.com/fxh7622/15900如需转载请自行联系原作者

fxh7622
相关文章
|
1月前
|
机器学习/深度学习 人工智能 自然语言处理
Transformer:Attention机制、前馈神经网络、编码器与解码器
Transformer:Attention机制、前馈神经网络、编码器与解码器
73 1
|
1月前
|
机器学习/深度学习 安全 算法
利用机器学习优化网络安全防御机制
【2月更文挑战第23天】 在数字化时代,网络安全已成为维护信息完整性、保障用户隐私的关键挑战。随着攻击手段的日益复杂化,传统的防御策略逐渐显得力不从心。本文通过引入机器学习技术,探索其在网络安全防御中的应用及优化路径。首先,概述了当前网络安全面临的主要威胁和机器学习的基本概念;其次,分析了机器学习在识别恶意行为、自动化响应等方面的潜力;最后,提出了一个基于机器学习的网络安全防御框架,并通过案例分析展示了其有效性。本研究旨在为网络安全领域提供一种创新的防御思路,以适应不断演变的网络威胁。
31 2
|
5月前
|
存储 网络协议 Java
网络通信的核心机制:Socket如何实现高效数据传输(上)
网络通信的核心机制:Socket如何实现高效数据传输
|
5月前
|
缓存 网络协议 Linux
网络的救命稻草:重传机制如何确保数据顺利传输?
在网络传输中,数据的可靠性和稳定性一直是一个重要的挑战。幸运的是,重传机制应运而生,为我们解决了这个问题。本文将深入探讨重传机制在网络中的应用和工作原理。我们将介绍TCP中最常见的超时重传和快速重传,以及SACK和D-SACK这两种高级重传机制。了解这些机制如何工作可以帮助我们更好地理解数据传输的可靠性和稳定性的保障。
123 1
网络的救命稻草:重传机制如何确保数据顺利传输?
|
5月前
|
存储 安全 Java
网络通信的核心机制:Socket如何实现高效数据传输(中)
网络通信的核心机制:Socket如何实现高效数据传输
|
8月前
|
机器学习/深度学习 传感器 算法
【LSTM分类】基于注意力机制的卷积神经网络结合长短记忆神经网络CNN-LSTM-attention实现数据分类附matlab代码
【LSTM分类】基于注意力机制的卷积神经网络结合长短记忆神经网络CNN-LSTM-attention实现数据分类附matlab代码
|
9月前
|
Kubernetes Perl 容器
Pod 的实现机制之网络篇
Pod 这样一个东西,本身是一个逻辑概念。Pod核心就在于如何让一个 Pod 里的多个容器之间最高效的共享某些资源和数据。
165 0
|
10月前
|
存储 安全 网络安全
《网络安全0-100》口令机制
《网络安全0-100》口令机制
105 0
|
10月前
|
开发框架 网络协议 安全
J2EE知识点总结_网络编程与Java反射机制
J2EE知识点总结_网络编程与Java反射机制
|
11月前
|
NoSQL 网络协议 安全
redis03——Redis的网络配置与心跳机制
redis03——Redis的网络配置与心跳机制

热门文章

最新文章