如何判断客户端与服务器断开连接?求助

一魅 2013-10-17 11:35:28
我用TCP协议编写了一个服务器和客户端(阻塞模式),其中服务器不停的向客户端发送信息,请问如果强行关闭客户端,那么服务器如何才能及时的知道此时已断开连接呢?
...全文
671 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
一魅 2013-10-31
  • 打赏
  • 举报
回复
引用 4 楼 boylafong 的回复:
我以前做过这个,我们是视频传输解决中断的问题. 定义一个局部变量 int a 每次收到数据把a置为0 起一个时钟(1000毫秒运行一次),每次a++,当a>3的时候我们就认为视频断开了 因为每次收到数据a都为0了,那么当有数据的时候,视频不会认为断开,当视频断开或者收不到数据的时候,a就会一直加,加到3的时候(3秒钟后)那么肯定是收不到数据了. 这样做是为了减少数据流量.客户端跟服务器都是如此.
您的这个方法好,呵呵,我试试看,谢谢了
一魅 2013-10-31
  • 打赏
  • 举报
回复
引用 3 楼 dingxz105090 的回复:
引用 2 楼 YI_MQ 的回复:
[quote=引用 1 楼 dingxz105090 的回复:] 设定客户端每次在收到服务端的指令时自动回一个特定消息用来判断连接状态(比如"Yes Madam"),那假如客户端连续3次都没回的话就断了?
那如果客户端连服务器的指令都接收不到呢?这个时候不就没法继续下一步了?求解答 谢谢了
客户端连服务器的指令都接收不到那就更没法回给你服务器了,那就更应该说明断开了[/quote] 嗯嗯,我现在就是用您说的这个方法来判断服务器和客户端是够断开连接的,效果貌似不错,我强制关闭客户端后,服务器的recv函数就会返回一个-1的值,呵呵,谢谢大侠!
凌乱哥 2013-10-17
  • 打赏
  • 举报
回复
设定客户端每次在收到服务端的指令时自动回一个特定消息用来判断连接状态(比如"Yes Madam"),那假如客户端连续3次都没回的话就断了?
boylafong 2013-10-17
  • 打赏
  • 举报
回复
我以前做过这个,我们是视频传输解决中断的问题. 定义一个局部变量 int a 每次收到数据把a置为0 起一个时钟(1000毫秒运行一次),每次a++,当a>3的时候我们就认为视频断开了 因为每次收到数据a都为0了,那么当有数据的时候,视频不会认为断开,当视频断开或者收不到数据的时候,a就会一直加,加到3的时候(3秒钟后)那么肯定是收不到数据了. 这样做是为了减少数据流量.客户端跟服务器都是如此.
凌乱哥 2013-10-17
  • 打赏
  • 举报
回复
引用 2 楼 YI_MQ 的回复:
引用 1 楼 dingxz105090 的回复:
设定客户端每次在收到服务端的指令时自动回一个特定消息用来判断连接状态(比如"Yes Madam"),那假如客户端连续3次都没回的话就断了?
那如果客户端连服务器的指令都接收不到呢?这个时候不就没法继续下一步了?求解答 谢谢了
客户端连服务器的指令都接收不到那就更没法回给你服务器了,那就更应该说明断开了
一魅 2013-10-17
  • 打赏
  • 举报
回复
引用 1 楼 dingxz105090 的回复:
设定客户端每次在收到服务端的指令时自动回一个特定消息用来判断连接状态(比如"Yes Madam"),那假如客户端连续3次都没回的话就断了?
那如果客户端连服务器的指令都接收不到呢?这个时候不就没法继续下一步了?求解答 谢谢了
EXE工具 telnet exe远程登陆 Telnet协议是TCP IP协议族中的一员 是Internet远程登陆服务的标准协议和主要方式 它为用户提供了在本地计算机上完成远程主机工作的能力 在终端使用者的电脑上使用telnet程序 用它连接到服务器 一 运行telnet的方法 当运行远程登录时 应首先运行Telnet程序进行联机 有两种运行Telnet的方法: 1 运行telnet的第一种方法: 输入下列命令 并以回车换行结束 下同 命令格式:telnet 主机网络地址 例如:假设用户要连接一台名叫dns的计算机 它的网络地址为xxxx IP地址为202 197 96 1 则连接时应输入命令telnet xxxx或telnet 202 197 96 1 如果用户要登录的主机与用户的计算机在同一个本地网上 通常可以只输入主机的名字 而不用输入完整的地址 例如上例可以输入: 命令:telnet dns 2 运行telnet程序的第二种方法: 输入命令:telnet 此时程序运行 但并未进行连接 因未指明主机 然后屏幕显示:telnet> 这是telnet的提示符 它表明telnet程序已经运行 并正在等待用户输入使用telnet的命令 如要连接一台远程主机 则使用open命令 即输入命令open 并附上该主机的网络地址 如 telnet> open xxxx 其连接效果与第一种方法完全一样 假如Telnet的运行不能与主机确定连接 则用户将会看到主机找不到的信息 例如 假设用户想要连接的远程主机为yyyy 而用户的输入为: telnet yyyy 则在屏幕上用户将会看到: yyyy: unknown host telnet> 此时 用户可以另输入正确的主机名进行连接 或者用Quit命令中止telnet程序的执行 导致telnet不能与远程主机连接的因素很多 常见的因素有三类:计算机地址输入有错 如上面例子所示;远程计算机暂时不能使用 如发生故障等 ;用户指定的计算机不在Internet上 处理这类情况的主要办法包括重新联机 隔一段时间再试等 对不在Internet上的计算机 使用当然是比较困难的 二 确认终端的仿真类型 终端仿真 terminal emulation 的类型直接影响到数据如何在自己使用的计算机上的显示 类型确定不正确 读者可能无法认读网络终端上显示的信息 这就是远程登录要确认网络终端类型的原因 对方系统一般以提问方式让读者确认自己所使用的计算机的终端仿真类型 如 Terminal emulation “ ”表示光标 在此读者只要键入相应的终端仿真类型即可 最常用的终端仿真为VT100 许多系统因此把VT100作为默认值 default 有的系统列举出各种终端仿真类型供用户选择 如果用户不清楚自己所用的终端仿真类型 可用dumb 哑终端 代之 另外 也有些系统会自动地为用户确认终端仿真类型 这对用户来说当然是最省心的 如果用户使用的是PC机 最好的回答通常是ANS1 因为大多数PC机的终端程序使用的ANS1终端协议 三 登录与退出对方系统: 当对方主机接通以后 就应登录到对方系统 如果登录标识和密码被对方系统接收并确认无误 用户就进入了对方系统 成了对方主机系统的一个远程终端使用者 进一步的工作如何进行 完全取决于主机系统的应用软件功能和用户的要求 用户只要按照系统的提示和操作程序进行操作 一般说来都可以完成自己预期的工作 退出对方系统有以下几种情况: 1 正常退出对方系统 这需要用户随时了解系统显示的信息 密切注意它显示的正常退出系统的命令 以便需要时使用 按照系统提示的方法退出该系统 实际上也就退出了Telnet 此时 用户又回到了本地机系统 2 记住强行退出对方系统的命令 换码符 在远程登录时 有时需要强行退出对方系统 这时可使用换码符 Escape Character 系统默认的换码符一般为“^ ]” 即CTRL键和 ]键同时按下 按此组合键即可终止联机 并显示下列提示符: Telnet> 可输入close或quit命令来终止远程登录 换码符的使用看起来无关紧要 但实际上在使用远程登录功能时是不可忽略的 它是使用Telnet时处理异常状态的重要手段 当无法用正常手段退出系统时 只要键入换码符即可平安退出Telnet并返回用户的本地计算机系统 3 Telnet的常用命令 任何时候 在telnet>提示符之后 都可以有选择地使用telnet的各种命令 以完成特定的功能 telnet的命令可通过help命令来了解它们的使用方法 以下是telnet的基本命令 对于不同的操作系统来说 这些命令也会稍有不同 常用命令及功能简介: help 联机求助 open 后接IP地址或域名即可进行远程登录 close 正常结束远程会话 回到命令方式 display 显示工作参数 mode 进入行命令或字符方式 send 向远程主机传送特殊字符 键入send 可显示详细字符 set 设置工作参数 键入set 可显示详细参数 status 显示状态信息 toggle 改变工作参数 键入toggle 可显示详细参数 ^ ] 换码符 escape character 在异常情况下退出会话 回到命令方式 quit 退出telnet 返回本地机 z 使telnet进入暂停状态 <cr> 结束命令方式 返回telnet的会话方式 6 2 3 Windows下telnet的软件使用 Telnet的用户软件有许多版本 一些运行在DOS下的Telnet软件操作比较复杂 要记的命令也比较多 鉴于目前大部分用户都通过SLIP PPP 帐号与Internet联接 我们仅介绍运行于Windows下的Telnet软件 Windows 95内置的远程登录客户端应用程序是一个很简单的终端软件 但基本的远程登录功能都有了 如果你在某个Unix机器上有帐号 那么就可以远程登录到该主机 例如登录湖大的一台Unix邮件服务器 在“开始”->“运行”窗口中输入: telnet xxxx 这时会弹出一个窗口: 窗口内有远程机器系统的提示 并在最后一行有“login:” 键入用户名后 出现“password:”提示 再输入该机器上对应该帐号的口令 就可以进入系统 拨号的Windows 95计算机就成了远程Unix机器的一个远程终端 你可以对Telnet程序做一些设置 主要有:在弹出的窗口中打开“终端”菜单“首选项” 终端选项: 本地响应:选择该复选框则设置Telnet程序中的键盘输入在本地也显示 默认不选 ; 闪烁光标 块状光标 VT100箭头:选择光标类型; 缓冲区大小: 设置Telnet显示窗口的高度 根据需要可增加和减少 例如改为99; 仿真: 可选择VT52或者VT100 ANSI终端类型 另外 你还可以设置使用的字体与显示的颜色等 如果在进行删除操作时使用“Backspace”或“Delete”键无效 反而在后面追加了“^H”或“^ ”字符 这是终端方式设置不对 可以更改仿真类型为“VT100 ANSI” 如果还不能使用这两个删除键之一 请使用“Ctrl”+“Backspace”或“Delete”键试一下 也可以在Unix的提示符下输入“stty erase ^H” 这里“^H”是按“Backspace”键出现的显示 以后就可以使用“Backspace”来删除输入出错的字符了 你可以使用Telnet程序提供的“终端” >“开始记录”功能记录你使用Telnet的全过程 选中后屏幕弹出文件窗口 提示输入记录文件名称 输 入完毕 开始Telnet的操作 操作完成后再选择“终端” >“停止记录”项 关闭记录文件 断开远程登录有两种方法 在Unix的$提示符下输入exit 这时提示与远程系统断开 或者是使用“连接”菜单的“断开”项断开 断开后 Telnet 窗口并不消失 再次连接时可用“连接”菜单的“远程系统” 宿主名称输入远程主机名 端口采用标准的Telnet端口或23 终端类型一般采用默认的 “vt100” 单击“连接”按钮即可重新连接 ">EXE工具 telnet exe远程登陆 Telnet协议是TCP IP协议族中的一员 是Internet远程登陆服务的标准协议和主要方式 它为用户提供了在本地计算机上完成远程主机工作的能力 在终端使用者的电脑上使用telnet程序 用它连接到服务器 [更多]
1、本课程是一个干货课程,主要讲解如何封装服务器底层,使用Tcp/ip长连接,IDE使用vs2019 c++开发以及使用c++11的一些标准,跨平台windows和linux,服务器性能高效,单服务器压力测试上万无压力,服务器框架是经历过上线产品的验证,框架简单明了,不熟悉底层封装的人,半个小时就能完全掌握服务器框架上手写业务逻辑。2、本课程是一个底层服务器框架教程,主要是教会学员在windows或linux下如何封装一个高效的,避免踩坑的商业级框架,服务器底层使用初始化即开辟内存的技术,使用内存池,服务器运行期间内存不会溢出,非常稳定,同时服务器使用自定义哈希hashContainer,在处理新的连接,新的数据,新的封包,以及解包,发包,粘包的过程,哈希容器性能非常高效,增、删、查、改永远不会随着连接人数的上升而降低性能,增、删、查、改的复杂度永远都是恒定的O(1)。3、服务器底层封装没有使用任何第三方网络库以及任何第三方插件,自由度非常的高,出了任何BUG,你都有办法去修改,查找问题也非常方便,在windows下使用iocp,linux下使用epoll.4、讲解c++纯客户端,主要用于服务器之间通信,也就是说你想搭建多层结构的服务器服务器服务器之间使用socket通信。还可以使用c++客户端做压力测试,开辟多线程连接服务器,教程提供了压力测试,学员可以自己做压力测试服务器性能。5、赠送ue4和unity3d通信底层框架以及多人交互demo,登录,注册,玩家离开,同步主要是教会学员服务器客户端如何交互。6、赠送c++连接mysql数据库框架demo,登录,注册,玩家离开数据持久化.7、服务器教程使用自定义通信协议,同时也支持protobuf,选择权在开发者自己手里,想用什么协议都可以,自由度高。8、服务器教程使用手动敲代码逐句讲解的方式开展教学课程。非喜勿喷,谢谢大家。9、服务器教程提供源码,大家可以在平台提供的地址下载或者联系我,服务器使用c++11部分标准,std::thread,条件变量,线程锁,智能指针等,需要学员具备一定c++知识,购买前请慎重考虑。

18,356

社区成员

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

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