[.NET] - 在Socket编程中遇到的问题总结
问题1.无法访问已释放的对象。 对象名:“System.Net.Sockets.Socket"
产生这个scenario的原因是程序中的某个地方调用到了socket.close后,这个socket还被调用。对此,可以在使用Send/SendAsync或Receive/ReceiveAsync方法是首先判断一下Socket对象是否已经释放并且连接还在:
if (stsend != null && stsend.Connected)
{
//your code...
}
所有非托管资源程序员必须能控制资源释放,诸如数据库连接,SOCKET连接等在使用后都应当显示关闭,如果是长连接,在程序退出时应当确保所有占用的连接都被关闭。
问题2."远程主机强迫关闭了一个现有的连接。"
一般是由于是server和client中的任意一方主动断开连接,导致弹出 “远程主机强迫关闭了一个现在连接”的异常。这种情况,会导致程序提示异常,无法继续往下执行。
可以通过异常处理的方式,通过异常来提示网络不正常,从而跳出该程序分支,不至于因为异常问题程序瘫痪!
如下图,一Catch到这类System.Net.Sockets.SocketException异常(当然这里把它设为Exceptioin异常,抓取的范围更广),那么就用MessageBox给用户一个提示,然后从该分支退出就行了。
private void ReceiveRecordBodyCallback(IAsyncResult ar)
{
StateObject state = (StateObject)ar.AsyncState;
try
{
if (state != null && state.workSocket.Connected)
{
}
}
catch (Exception e)
{
asyncSocketServer.CloseAndDisposeConnection(state, e.ToString(), ErrorLevel.Level1);
}
}
问题3.由于计算机积极拒绝。。无法连接。
这通常是目标机没有开启该端口的侦听,比如服务端没有启动,IP可以PING通,但是connect到端口会被拒绝.查看服务端和客户端是否都有正确配置监听端口和连接。
问题4.引发类型system.outofmemoryExeption异常。
一种可能是在一个循环里开启了监听但是没有阻断线程:

"AcceptClientsAsync(listener, cts.Token)"由于是异步的在调完之后就会立即返回然后继续下一次调用,这样就在无限循环了。
可以把下一个连接放在上一个连接的AceeptCallBack中:
private void AcceptCallback(IAsyncResult ar)
{
StateObject state = null;
try
{
Socket listener = (Socket)ar.AsyncState;
Socket handler = listener.EndAccept(ar);
//接受下一次连接
listener.BeginAccept(new AsyncCallback(AcceptCallback), listener);
}
}
问题4.通常每个套接字()只允许使用1次。
已经对某端口进行了侦听,代码重复执行,又对同一端口侦听.
问题5.您的主机软件中止了一个已建立的连接。
这是服务端关闭,客户端抛出的异常,需要诊断服务端代码.建议在服务器端部署一套详细的日志系统这样出问题后可以快速找到问题。
问题6.异步通信中长连接问题
这是个很常见的问题,产生原因一把由于网络不通畅造成数据延迟接收或发送,可以设置一个心跳包机制,即在程序空闲的时候每隔一定时间就向对端发送一个很小的数据包,然后对端接受到后也发回同样的包,以确保双方都知道连接还在,否则就设置超时,踢掉对端。
[.NET] - 在Socket编程中遇到的问题总结的更多相关文章
- socket编程中客户端常用函数
1 常用函数 1.1 connect() int connect(int sockfd, const struct sockaddr *servaddr, socklen_taddrlen); 客 ...
- socket编程中write、read和send、recv之间的区别~转载
socket编程中write.read和send.recv之间的区别 http://blog.csdn.net/petershina/article/details/7946615 一旦,我们建立 ...
- PHP socket 编程中的超时设置
PHP socket 编程中的超时设置.网上找了半天也没找到.贴出来分享之:设置$socket 发送超时1秒,接收超时3秒: $socket = socket_create(AF_INET,SOCK_ ...
- Socket 编程中,TCP 流的结束标志与粘包问题
因为 TCP 本身是无边界的协议,因此它并没有结束标志,也无法分包. socket和文件不一样,从文件中读,读到末尾就到达流的结尾了,所以会返回-1或null,循环结束,但是socket是连接两个主机 ...
- Linux socket 编程中存在的五个隐患
前言: Socket API 是网络应用程序开发中实际应用的标准 API.尽管该 API 简单,但是 开发新手可能会经历一些常见的问题.本文识别一些最常见的隐患并向您显示如何避免它 ...
- Socket编程中的强制关闭与优雅关闭及相关socket选项
以下描述主要是针对windows平台下的TCP socket而言. 首先需要区分一下关闭socket和关闭TCP连接的区别,关闭TCP连接是指TCP协议层的东西,就是两个TCP端之间交换了一些协议包( ...
- Socket编程中检测端口是否被占用
一般检测一个端口是否被占用的方法是看bind是否成功,其实在Windows中有两个API可以获取到当前系统端口的占用情况(GetTcpTable/GetUdpTable),利用这两个函 ...
- [转]Socket编程中,阻塞与非阻塞的区别
阻塞:一般的I/O操作可以在新建的流中运用.在服务器回应前它等待客户端发送一个空白的行.当会话结束时,服务器关闭流和客户端socket.如果在队列中没有请示将会出现什么情况呢?那个方法将会等待一个的到 ...
- Socket编程中,阻塞与非阻塞的区别
阻塞:一般的I/O操作可以在新建的流中运用.在服务器回应前它等待客户端发送一个空白的行.当会话结束时,服务器关闭流和客户端socket.如果在队列中没有请示将会出现什么情况呢?那个方法将会等待一个的到 ...
- TCP与UDP在socket编程中的区别
一.TCP与UDP的区别 基于连接与无连接 对系统资源的要求(TCP较多,UDP少) UDP程序结构较简单 流模式与数据报模式 TCP保证数据正确性,UDP可能丢包 TCP保证数据顺序,UD ...
随机推荐
- LaTeX中的特殊字符
空白符号代码及注释: 显示效果: 控制符.排版符号.标志符号.引号.连字符.非英文字符和重音符号的代码及注释: 显示效果:
- LeetCode 026 Remove Duplicates from Sorted Array
题目描述:Remove Duplicates from Sorted Array Given a sorted array, remove the duplicates in place such t ...
- 软件工程与UML第二次作业
博客班级 https://edu.cnblogs.com/campus/fzzcxy/2018SE2/ 作业要求 https://edu.cnblogs.com/campus/fzzcxy/2018S ...
- 网络基础:ip地址
原文链接:http://blog.51cto.com/xiexiaojun/1882088 很棒的总结,概念+例题很清晰
- Spring Cloud Alibaba 初体验(一) Nacos 配置中心
一.Nacos 下载与初始化配置 本文使用1.2.0,下载地址:https://github.com/alibaba/nacos/releases Nacos 单机模式支持持久化配置到 MySQL 数 ...
- 第4.3节 Python中与迭代相关的函数
下面要介绍的enumerate.range.zip.reversed.sorted属于Python内置的函数或者类别,返回的对象都可通过迭代方法访问. 一. enumerate函数 1. ...
- PyQt(Python+Qt)学习随笔:QTabWidget选项卡部件外观展示类属性elideMode、documentMode、tabBarAutoHide、tabShape介绍
QTabWidget的外观展示类属性包括tabPosition.tabShape.elideMode.usesScrollButtons.documentMode.tabBarAutoHide和ico ...
- 第11.19节 Python 中正则表达式的扩展功能:前视断言和前视取反
一. 引言 在<第11.16节 Python正则元字符"()"(小括号)与组(group)匹配模式>中老猿介绍了组匹配模式的命名组功能及引用组功能,这两者都是组模式的扩 ...
- crawlergo动态爬虫去除Spidername使用
本来是想用AWVS的爬虫来联动Xray的,但是需要主机安装AWVS,再进行规则联动,只是使用其中的目标爬虫功能感觉就太重了,在github上面找到了由360 0Kee-Team团队从360天相中分离出 ...
- Docker环境复现利用Redis未授权访问漏洞 >> 批量扫描检测利用
关于Redis Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库 ...