独立存在是什么意思?

先来看一个例子.我们知道一个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"));
}
});
}
}
}
}

最新文章

  1. Django开发笔记
  2. 深入探讨在集群环境中使用 EhCache 缓存系统
  3. 数据库整合数据报表SQL实战
  4. 《2016ThoughtWorks技术雷达峰会----雷达新趋势》
  5. Oracle 数据库安装
  6. 解决iOS内存泄露
  7. strong和b
  8. MS CRM 2011的自定义和开发(11)——插件(plugin)开发(二)
  9. 等宽格子堆砌 js
  10. 单例模式C#
  11. PHP 单列模式实例讲解以及参考网址
  12. C++ Primer 学习笔记_41_STL实践与分析(15)--先来看看算法【下一个】
  13. Kanzi 倒影效果制作
  14. 【BZOJ4195】【NOI2015】程序自动分析(并查集)
  15. [工具向]__androidstudio签名打包apk及配置自动签名
  16. 如何增加Ubuntu交换空间swap
  17. eclipse/idea远程调试Linux程序
  18. ubuntu下使用nvm安装nodejs
  19. 部署自己配置的nginx到kubernetes,并且能通过ingress访问
  20. 【JAVA WEB教程】jsp环境搭建+部署网站(eclipse+tomcat)【详细+图文】

热门文章

  1. iptables 的学习资源
  2. Spring管理的bean初始化方法的三种方式,以及@PostConstruct不起作用的原因
  3. 使用WIFI连接android进行调试和adb操作
  4. android中非堵塞socket通信
  5. iOS使用自己定义字体
  6. js 元素Dom新建并插入页面createElement
  7. linux命令的别名alias,unalias
  8. lua学习笔记(二)
  9. quartus2 13.0+modelsim联合开发环境搭建(win10)
  10. [译]GLUT教程 - 改变窗体大小