SocketAsyncEventArgs里的AcceptSocket能独立存在吗?
独立存在是什么意思?
先来看一个例子.我们知道一个Socket对象(我们叫他ListenScoket)可以调用AcceptAsync并接受一个SocketAsyncEventArgs对象,如果操作成功则ListenSocket会为SocketAsyncEventArgs对象创建一个新的Socket对象(我们叫它AcceptSccket)。也就是这样
listenSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);listenSocket.Bind(new IPEndPoint(IPAddress.Parse("10.175.5.172"), 60000));listenSocket.Listen(10);SocketAsyncEventArgs asyncEventArgs =new SocketAsyncEventArgs();asyncEventArgs.Completed += asyncEventArgs_Completed;listenSocket.AcceptAsync(asyncEventArgs);
如果ListenSocket关闭之后AcceptSocket还可以正常工作,那么我们就说AcceptSocket是独立存在的.
那到底AcceptSocket能否独存在呢?
首先我们来看AcceptSocket是什么时候创建的.其实当listenSocket.AcceptAsync(asyncEventArgs)执行的时候SocketAsyncEventArgs内部的AcceptSocket就已经被创建了,但是它不能被用来发送和接收数据.假如我们在AcceptAsync之后紧跟着调用AcceptSocket来发送一个”OK”字符串,那么会得到这样一个错误:
'asyncEventArgs.AcceptSocket.Send(ASCIIEncoding.ASCII.GetBytes("OK"))' threw an exception of type 'System.Net.Sockets.SocketException'
base: {"A request to send or receive data was disallowed because the socket is not connected and (when sending on a datagram socket using a sendto call) no address was supplied"}
ErrorCode: 10057
Message: "A request to send or receive data was disallowed because the socket is not connected and (when sending on a datagram socket using a sendto call) no address was supplied"
SocketErrorCode: NotConnected
注意错误消息中被标为红色的部分,这说明AcceptSocket对象已经创建了,不过没有可用的地址,也就是没有客户端IP和端口.这个很好理解,因为客户端还没有连接上呢.当客户端连接成功的时候,ListenSocket会将客户端的地址(IP和端口)赋予AcceptSocket.同时,SocketAsyncEventArgs的Completed事件会被触发,我们就知道AcceptSocket可以正常使用了.
为什么会有这个疑问呢? 在我们的应用中ListenSocket会创建很多的AcceptSocket, 某一个时刻我们想停止接收更多新的Socket连接,同时又想保持现有的连接,那么我们可以直接把ListenSocket关闭.经过测试是不需要担心AcceptSocket会受到影响的.也就是说AcceptSocket可以独立存在的. 下面是测试代码.
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks; namespace SocketAsyncEventArgsTest
{
class Program
{
static int socketCount = ;
static Socket listenSocket;
static void Main(string[] args)
{
listenSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
listenSocket.Bind(new IPEndPoint(IPAddress.Parse("10.175.5.172"), ));
listenSocket.Listen();
SocketAsyncEventArgs asyncEventArgs =new SocketAsyncEventArgs();
asyncEventArgs.Completed += asyncEventArgs_Completed;
listenSocket.AcceptAsync(asyncEventArgs); SocketAsyncEventArgs asyncEventArgs2 = new SocketAsyncEventArgs();
asyncEventArgs2.Completed += asyncEventArgs_Completed;
listenSocket.AcceptAsync(asyncEventArgs2); //listenSocket.Close(); Console.Read();
} static void asyncEventArgs_Completed(object sender, SocketAsyncEventArgs e)
{
if (SocketError.Success == e.SocketError)
{
socketCount++;
if ( == socketCount)
// Close the listen socket will not close the accept sockets opened by it.
// so the accept socket can continue receive/send data normally.
listenSocket.Close(); Socket acceptSocket = e.AcceptSocket;
byte[] buffer=new byte[];
Task.Factory.StartNew(() =>
{
while(true)
{
acceptSocket.Receive(buffer);
Console.WriteLine(ASCIIEncoding.ASCII.GetString(buffer));
acceptSocket.Send(ASCIIEncoding.ASCII.GetBytes("OK"));
}
});
}
}
}
}
SocketAsyncEventArgs里的AcceptSocket能独立存在吗?的更多相关文章
- 基于SocketAsyncEventArgs的版本
文字水平差就慢慢开始练习,同时分享一下,项目中写的简单socket程序,不同方式的版本,今天上一个异步.可能实现高性能的处理方式.IOCP就不多说了,高性能的完成端口,可以实现套接字对象的复用,降低开 ...
- SuperSocket Code解析
SuperSocket1.6Code解析 Normal Socket System.Net.Sockets.dll程序集中使用socket类: 服务器: 创建socket:_socket = new ...
- 《同一个类中不同方法之间的调用相关问题(省略的类名或者this)》
//同一个类中不同方法之间的调用相关问题(省略的类名或者this) class A { public void B() { System.out.println("b方法运行"); ...
- JavaSE——面向对象与面向过程、类与对象、(属性、方法、构造器)等
一:面向对象与面向过程 二者都是一种思想,面向对象是相对于面向过程而言的. 面向过程: 1.面向过程思想强调的是过程(动作). 2.在面向过程的开发中,其实就是面向着具体的每一个步骤和过程,把每一个步 ...
- C#网络编程(二)应用篇
(一)TcpListen类.TcpClient类 TcpListener类和TcpClient类都是System.Net.Sockets命名空间下的类,利用TcpListener和TcpClient可 ...
- JavaSE 第二次学习随笔(关于内存的小题)
class HelloA { public HelloA() { System.out.println("HelloA"); } { System.out.println(&quo ...
- Java编程基础阶段笔记 day 07 面向对象编程(上)
面向对象编程 笔记Notes 面向对象三条学习主线 面向过程 VS 面向对象 类和对象 创建对象例子 面向对象的内存分析 类的属性:成员变量 成员变量 VS 局部变量 类的方法 方法的重载 可变个 ...
- java面向对象详细全面介绍
一.面向对象 1.面向过程与面向对象 POP与OOP都是一种思想,面向对象是相对于面向过程而言的.面向过程,强调的是功能行为,以函数为最小单位,考虑怎么做.面向对象,将功能封装进对象,强调具备了功能的 ...
- Java再谈方法
1.3再谈方法 1.3.1 什么是方法(函数) ①方法是类或对象行为特征的抽象,也称为函数. ②Java里的方法不能独立存在,所有的方法必须定义在类里. 修饰符 返回值类型 方法名(参数类型 形参1, ...
随机推荐
- 如果你还有以下这些现象,那你仍是PHP菜鸟:
最近看了个文章,写的很精辟,跟大家分享一下,这也是我的目标: 如果你还有以下这些现象,那你仍是PHP菜鸟:1. 不会利用如phpDoc这样的工具来恰当地注释你的代码:2. 对优秀的集成开发环境如Zen ...
- 8.使用JPA保存数据【从零开始学Spring Boot】
转载:http://blog.csdn.net/linxingliang/article/details/51636989 在看这一篇文档的话,需要先配置好JPA – hibernate. 总体步骤: ...
- RxJava操作符总结之过滤
RxJava操作符总结之过滤 jsut() just(T t1, T t2, T t3 ....) ,just能够传入多个同样类型的參数,并将当前參数一个接着一个的发送. Observable.jus ...
- 【VBA】获取模板保存的路径
使用VBA如何获取模板保存的路径呢?具体代码如下: Sub 获取Excle模板保存路径() MsgBox "获取Excle模板保存路径:" & Application.Te ...
- 【VBA】隐藏正在使用的工作簿
正在使用的工作簿,嫌窗口太多,不利于操作,想把窗口隐藏,该怎么做呢? Public Sub 隐藏正在使用的工作簿() Application.Visible = False MsgBox " ...
- 键盘上所有键位的ascii值
上次用的时候一直找,这次找到了,收藏起来. 0x1 鼠标左键 0x2 鼠标右键 0x3 CANCEL 键 0x4 鼠标中键 0x8 BACKSPACE 键 0x9 TAB 键 0xC CLEAR 键 ...
- Delphi里J+开关作用类似C语言的static变量
從前筆者曾經對以下的程式產生過疑惑:{$J+}procedure TForm1.Button1Click(Sender: TObject);const VarConst: integer = 4;b ...
- Cookie-Parser是怎样解析签名后的cookie的(同一时候对cookie和cookie-signature进行说明)
第一步:我们来学习一下cookie-signature: var cookie=require('./index'); var val = cookie.sign('hello', 'tobiisco ...
- VLOOKUP函数的用法
https://zhidao.baidu.com/question/177265501.html?qbl=relate_question_0&word=%3DVLOOKUP%28B10%2CS ...
- 解决H5在微信浏览器或QQ浏览器修改title的问题
传送门:http://blog.csdn.net/code_for_free/article/details/51195468 如果是Android,使用 document.title = ‘1231 ...