[.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 ...
随机推荐
- git原理-本地仓库认识
项目人员使用git,几乎70%的工作都是在本地仓库完成的.由此可见本地仓库的重要性. 下面我们就通过一些基本的命令讲下git的本地仓库的结构,存储流程,数据类型,如何存储...... 仓库结构 大家都 ...
- web端项目如何测试
1.是否支持各种网络 2.网络如果演示能否正常加载 3.加载时断网还能加载出来么 4.浏览时断网页面是否保持 5.是否兼容各种不同的浏览器 6.不同的浏览器加载出的页面是否一致 7.页面效果如何 8. ...
- 基于HAL库的STM32的DSP库详解(附FFT应用)
1 . 建立工程,生成代码时选择包含所有库. 2. 打开 option for target 选择 Target 标签,在code generatio中,将floating point hardw ...
- C++调用C接口
目录 C++调用C代码 解决调用失败问题 思考:那C代码能够被C程序调用吗 C代码既能被C++调用又能被C调用 C++调用C代码 一个C语言文件p.c #include <stdio.h> ...
- apply 、call 以及 bind 的使用和区别
一.被apply和call调用的函数中没有传递参数 (一)不传参数 结果: (二)传递 null 结果: 总结: 1.当使用 apply和 call去调用函数并且没有传递参数时,前提这个函数中也没有传 ...
- Windows平台部署Asp.Net Core应用
一. 简介 Asp.Net Core 部署方式有两种:依赖框架和独立部署. 1. 框架依赖的部署: 顾名思义,依赖框架的部署 (FDD) 依赖目标系统上存在共享系统级版本的 .NET Core. 由于 ...
- 这可能是最为详细的Docker入门总结
写在前面 毕设是关于区块链的,自然就用到了docker,感觉到了docker的强大.学习源于总结,所以找了一些资料,这篇文章原作写的不错,看了好多遍哈哈. 这可能是最为详细的Docker入门总结 市面 ...
- Python运算符的优先级是怎样的?
优先级数字越高表示优先级越高,有关运算符的详细介绍请参考<Python运算符大全>
- 第8.1节 Python类的构造方法__init__深入剖析:语法释义
一. 引言 凡是面向对象设计的语言,在类实例化时都有构造方法,很多语言的构造方法名与类名一致,Python中类的构造方法比较特殊,必须是__init__特殊方法. 二. 语法释义 1. ...
- react路由初探(1)
import React from 'react'; import logo from './logo.svg'; import './App.css'; class About extends Re ...