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.

    守护线程:程序在运行的时候,在后台提供通用服务的线程,比如垃圾回收线程。当所有的非守护线程结束的时候,程序终止,同时杀死进程中所有的守护线程。反过来说,只要非守护程序还在运行,程序就不会终止。

    守护线程要注意以下几点:

  1. 守护线程在thread.start()之前设置,否则汇报IllegalThreadException异常。不能把正在运行的常规线程设置为守护线程
  2. 在Deamon 线程中产生的线程也是Daemon的
  3. 守护线程应该永远不去访问固有资源,如文件,数据库,因为他会在任何操作的时候发生中断。

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)
posted @ 2018-07-24 14:45  sujingnuli  阅读(940)  评论(0编辑  收藏  举报