博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SocketAsyncEventArgs里的AcceptSocket能独立存在吗?
阅读量:4648 次
发布时间:2019-06-09

本文共 3678 字,大约阅读时间需要 12 分钟。

独立存在是什么意思?

先来看一个例子.我们知道一个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 = 0;        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"), 60000));            listenSocket.Listen(10);            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 (2 == 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[1024];                Task.Factory.StartNew(() =>                {                    while(true)                    {                        acceptSocket.Receive(buffer);                        Console.WriteLine(ASCIIEncoding.ASCII.GetString(buffer));                        acceptSocket.Send(ASCIIEncoding.ASCII.GetBytes("OK"));                    }                });            }        }    }}

 

转载于:https://www.cnblogs.com/rader/p/4354236.html

你可能感兴趣的文章
LOJ 2537 「PKUWC2018」Minimax
查看>>
使用java中replaceAll方法替换字符串中的反斜杠
查看>>
Some configure
查看>>
流量调整和限流技术 【转载】
查看>>
正由另一进程使用,因此该进程无法访问此文件。
查看>>
1 线性空间
查看>>
VS不显示最近打开的项目
查看>>
MyEclipse安装Freemarker插件
查看>>
计算多项式的值
查看>>
DP(动态规划)
查看>>
chkconfig
查看>>
最强的篮球队和马尔可夫模型
查看>>
pyQt 每日一练习 -- 登录框
查看>>
wp 删除独立存储空间文件(多级非空文件夹删除)
查看>>
Loadrunner安装使用入门
查看>>
smartupload 上传文件时 把页面编码改成gbk 解决乱码
查看>>
EPS是什么格式
查看>>
Python的数据库操作(Sqlalchemy)
查看>>
2.抽取代码(BaseActivity)
查看>>
My simplified pickit2 clone
查看>>