AsyncSocket
1.AsyncSocket与SyncSocket区别
Socket 分为 同步,异步,阻塞,非阻塞。
阻塞 block 当拨打某热电话,但是此人不在,你拿电话等他回来,期间不能再用电话,
非阻塞 nonblock 当拨打某人带你花,此人不在,你挂断电话,等会儿再打。即轮询/POLL.
异步 你打电话,此人不在,你叫接电话的人,告诉那人,回来后跟你打电话。
同步异步指通信模式
阻塞非阻塞指 在接收和发送时,是否等待动作完成才返回。
在实现过程中,如果服务端是异步的,客户端也是异步的,通信效率会很高。但是如果服务端在请求的返回时,也是返回给请求的链路时,客户端是可以同步的。这种情况下,服务端兼容同步和异步。
2.IPEndPoint
要与远程主机进行通信,仅有IP是不够的。在Internet中,TCP/IP 使用一个网路地址和一个服务端口号来唯一标识
设备和服务。网路地址标识网络上的设备号;端口号表示该设备上的特定服务。网络地址和服务端口的组合称为端点。
在c#中,使用IPEndPoint来表示这个终点。该类 包含应用程序链接到 主机的服务 所需的IP 和 端口地址。
构造函数:public IPEndPoint(IPAddress ,int).
3.阻塞和非阻塞
Windows 套接字 在两种模式下 执行I/O 操作,阻塞和非阻塞。在阻塞模式下,在I/O操作完成前,执行操作的函数会一直执行下去,不会立即返回程序。而在非阻塞模式下,winsock函数无论如何都会立即返回。
在同步模式中,对执行网路操作的函数 如 send 和 receive 的调用,一直等到操作完成后,才将控制权返回给调用程序。
在异步模式中,这些调用将立即返回控制权。
4.Semaphore 发出新型号装置。信号量。
5.Daemon Thread 守护线程
线程分为两类:
-
用户线程 UserThread
-
守护线程 Daemon Thread.
守护线程:程序在运行的时候,在后台提供通用服务的线程,比如垃圾回收线程。当所有的非守护线程结束的时候,程序终止,同时杀死进程中所有的守护线程。反过来说,只要非守护程序还在运行,程序就不会终止。
守护线程要注意以下几点:
- 守护线程在thread.start()之前设置,否则汇报IllegalThreadException异常。不能把正在运行的常规线程设置为守护线程
- 在Deamon 线程中产生的线程也是Daemon的
- 守护线程应该永远不去访问固有资源,如文件,数据库,因为他会在任何操作的时候发生中断。
6.AsyncSocketUserToken .
用于AsyncSocketUserToken绑定,保存每个Socket服务对象,
包括:m_receiveEventArgs 接收数据异步事件
m_asyncReceiveBuffer 接收数据异步事件使用的缓存
m_sendEventArgs 发送数据异步事件
m_receiveBuffer 接收异步事件返回的数据存放缓存
m_sendBuffer 保存发送的数据缓存
4.IOCPSocketServer
m_asyncSocketUserTokenPool.管理所有空闲的
7.Semaphore 信号量
Semaphore 负责协调各个线程,以保证它们能够正确的,合理的使用公共资源。也是操作系统中,用于控制进程同步互斥的量。
信号量Semaphore常用的方法:WaitOne(),Relase().
Release() 作用:退出信号,并返回前一个计数。
WaitOne() 阻止当前线程,直到当前线程的WaitHandle接收到信号。
Semaphore sema=new Seamphore(x,y);
x:剩余的位置数量
y:总的位置数量
8.Socket
(1)new Socket(IPEndPoint.AddressFamily,SocketType.Stream,ProtocolType.Tcp);
Socket()有三个参数,
* domain 协议簇,通常支持IPV4,IPV6,AF_LOCAL,AF_UINX等
* type .Socket类型.通常长有STREAM,DARAM,SOCK_RAW等
* protocal .协议。通常用TCP,DUP,STCP,TICP等。
(2)bind()函数
bind()把地址族中的特定地址赋给socket .了例如AF_INET 就是把ipv4或者Ipv6的地址和端口组合给Socket
(3)listen()函数
如果作为一个服务器,Socket(),Bind()之后,就会调用Listen()来监听这个Socket.如果客户端这时候调用connect()来发出链接请求,服务器端就会接收到这个请求。
int listen(int sockfd,int backlog);
int connect(int sockfd,const struct sockaddr);
(4)accept()函数
TCP服务器端 一次调用 socket(),bind(),listen()之后,就会监听指定的Socket地址。
TCP客户端 依次调用了socket(),connect()之后,就向TCP服务端发送一个链接请求,
TCP服务端监听到这个请求后,就会调用accept()来接收这个请求,这样就建立好了链接。
之后可以进行I/O操作。
(5)recv(),send()
至此 服务器与客户端已经建立好链接了,可以调用I/O进行读写。实现网路中不同进程之间的通信。
网络I/O操作
* read()/write()
* recv()/send()
* readv()/writev()
* recvmsg()/sendmsg()
* recvfrom()/sendto()
(6)