远程协助开发总结(三)

这里主要总结一下这段时间对Socket编程的总结

1.如何正确的接收数据和如何正确的关闭连接

接收数据要配合正确的关闭连接来使用,关闭连接的时候要先Shutdown本地套接字,这样远程套接字就会Receive一个0字节,远程主机可以根据这个判断是否关闭连接,如果我们直接Close一个套接字,那么远程套接字会直接抛出一个SocketException终止了一个已建立的连接,如果我们可以避免异常的产生尽量不使用异常。

 clientSocket.Shutdown(SocketShutdown.Both);
 clientSocket.Close();
 bufLen = s.Receive(buffer);
 if (bufLen == 0)
 {
   break;
 }

2.关闭了本地套接字,远程套接字也要及时关闭

针对一的问题,我们关闭了本地套接字,但是远程的套接字其实还是打开的状态,所以要及时关闭。break出循环程序的时候,我们在下面关闭连接,当然关闭的做法和一中的一样Shutdown->Close

3.如何避免一个封锁操作被对 WSACancelBlockingCall异常产生

先解释一下这个异常是怎么产生的,我们先主动Close掉本地套接字的时候,由于本地套接字也在Receive状态中,这是一个阻塞的状态,所以取消一次正在进行中的阻塞调用异常就会抛出来。这个异常本身并不会造成任何危害,因为你套接字已经关闭了,正处于阻塞状态的Recieve方法调用肯定失去了意义,运行时帮我们取消了这次调用,但是如果你觉得这个异常“别扭”,注意我这里加了引号,也是可以解决的,那就是我们在关闭一个套接字之前,先把Recieve的当前线程终止掉,线程终止了,Recieve调用自然不存在了,你再关闭连接的时候自然不会报了,但是这种做法也是那异常换异常,因为强制终止一个异常,套接字正处在一个阻塞状态,所以会产生一个ThreadAbort异常

clientThread.Abort();
clientSocket.Shutdown(SocketShutdown.Both);
clientSocket.Close();

所以接下来我来介绍一下到底该怎样正确的关闭连接,避免异常产生,以上所有异常的产生归根结底是Close的时机不对造成的,如果我们手动关闭一个套接字,正确的做法是只要Shutdown就可以了,后面不要紧跟着Close方法

当Shutdown的时候,这时候无论是本地套接字还是远程套接字都会空接退出循环,我们可以把Close放在循环体外面,分别关闭它们。

时间: 2024-10-20 04:41:54

远程协助开发总结(三)的相关文章

远程协助开发总结(二)

远程协助开发的过程中继续总结 针对开发总结一的问题,改正了一些地方 1.图像和命令采用两个套接字,为什么不能采用一个套接字?远程协助是快频的通信,图像需要不间断的从受控端发送到控制端,发送接收压力都很大,另外控制端还要发送鼠标和键盘命令到受控段,这个发送频率在操作的时候也很大.所以使用一个套接字压力太大. 2.图像的传输,图像比较大一般100-300K,所以需要多次分发,为了保证分发的安全性,先发送文件大小,再发送文件内容 3.命令的传输,不适合像文件那样的精确发送,可以设置一个缓冲,一般几百k

Linux git 多人协助开发实战

git 服务器搭建 创建公钥,准备免密登录 初始化一个版本库 git clone  git客户端 查看git状态 创建一个文件 添加到暂缓区 提交到版本库 查看git日志 checkout 从缓存区恢复文件到工作区 reset 版本区恢复到缓存区 查看git日志 reset --hard 工作区,缓存区被版本库重置 查看工作区与缓存区的差异 查看缓存区与版本库的差异 查看工作区与版本库的差异 演示git状态,精简状态 删除版本库的文件 从版本库恢复文件 查看文件提交的历史信息,便于bug追踪 b

【转】可在广域网部署运行的QQ高仿版 -- GG叽叽V2.4,增加远程协助、桌面共享功能(源码)

QQ的远程协助.或者说桌面共享是一个非常实用的功能,所以,2.4版本的GG复制了它,而且,GG增强了桌面共享的功能,它可以允许指定要共享桌面的区域,这样,对方就只能看到指定区域的桌面,这对节省流量会非常有帮助. GG实现这些功能的过程并不是那么简单,因为内部业务逻辑的关联容易把人搞晕.从运行起来的程序来说,远程协助的场景很容易理解:一方是请求方,一方是协助方,边界非常清晰.但是在程序中,无论是哪一方,其对应的窗体都是ChatForm,所以,在编码时,你经常需要切换你的思维:一会要站在请求方的角度

在UML系统开发中有三个主要的模型

http://www.cnblogs.com/Yogurshine/archive/2013/01/14/2859248.html 在UML系统开发中有三个主要的模型: 功能模型: 从用户的角度展示系统的功能,包括用例图.  对象模型: 采用对象,属性,操作,关联等概念展示系统的结构和基础,包括类图.对象图.包图.  动态模型: 展现系统的内部行为. 包括序列图,活动图,状态图. UML的重要内容可以由以下五种类图定义 用例图:从用户角度描述系统功能,并指各功能的操作者. 静态图:包括类图,包图

[Linux]当一个棘手问题需要即可定位,如何协助开发,缩小定位范围

写在前面:前段时间,朋友给我说了一个她亲身经历的某知名企业面试故事,面试结束感觉自己已脱了一层皮...面试官的问题并不刁钻,但是却是步步紧逼,而且有点类似拜占庭将军问题,只是拜占庭将军问题是所有的假设都不可靠,面试官的问题是,啥也不知道,也没有规律,又严重,又不知道怎么引发...无从下手的一个棘手问题,如何协助开发定位分析,细想想,起始无非是先排除服务器相关可能,然后再一步步剥离,将嫌疑犯范围缩小,尽可能帮助研发发现并定位到罪魁祸首,当然也许不仅仅是一个元凶. 问题是这样子:某天,发现一个问题,

设置Windows 远程协助与远程桌面

家庭局域网组建完成后,即可通过远程协助解决各种问题,或联机玩游戏等. 使用Windows 7\8\10 远程协助与远程桌面 Windows 8系统中自带了远程协助功能,家庭用户只需要做简单的设置,就可以让其他用户帮助自己解决使用电脑时遇到的问题,与QQ的远程协助有异曲同工之妙. 应用远程协助功能 步骤一:选择"远程设置" 步骤二:远程,单击"允许远程协助连接这台计算机",再确定 步骤三:搜索 步骤四:设置-> 协助 -> 邀请某人连接到你的电脑为你提供帮

Android 深度探索(卷1)HAL 与驱动开发 第三章 GIT 使用入门 心得体会

Android 深度探索(卷1)HAL 与驱动开发 第三章 GIT 使用入门 心得体会 本章主要介绍GIT的学习,以及介绍GIT用于获取诸多开源项目的源代码. 在使用GIT之前我们首先对其安装,其安装命令: #apt-get  install git #apt-get  install git-doc git-svn git-gui gitk 在Linux 下可以直接使用man命令查看指定命令的帮助文档.这对我们初学者提供了很大的帮助. Git的功能很复杂,为此这章节举例为我们演示如何创建版本库

ios 多线程开发(三)Run Loops

Run loops是线程相关的一些基本东西.一个run loop是一个处理消息的循环.用来处理计划任务或者收到的事件.run loop的作用是在有事做的时候保持线程繁忙,没事的时候让线程挂起. Run loop的管理并不是完全自动的.你仍然需要设计代码来在合适的时候启动run loop来相应事件.Cocoa和Core Foundation都提供了run loop对象来配置和管理run loop.程序并不需要创建这些对象,每个线程,包括主线程都有一个对应的run loop对象.只有非主线程需要明确

VMware Horizon虚拟桌面工具箱之审计与远程协助

VMware Horizon产品提供了业界领先的虚拟桌面服务,安全.便利.高效,正逐渐成为下一代企业桌面的最佳选择.今天,我们向大家推荐一款由VMware公司开发的"Horizon工具箱"软件,它为Horizon 6虚拟桌面增加了非常强大的审计与远程协助功能.并且,所有已经部署了Horizon 6虚拟桌面的用户都可以免费从官方网站(https://labs.vmware.com/flings/view-auditing-portal)下载使用. 这款工具箱软件可以直接安装在Horizo