同步、异步、阻塞、非阻塞的概念:
同步方式:在客户端发送请求后,必须获得服务器的回应之后才能发送下一个请求。此时,所有的请求在服务器得到同步
异步方式:在客户端发送请求后,不必等待服务器的回应就能够发送下一个请求。
阻塞方式:指在执行套接字的调用函数只有在得到结果之后才会返回,在调用结果返回之前,当前线程会被挂起,即此套接字一直阻塞在线程调用上,不会执行下一条语句。
非阻塞方式:指执行套接字的调用函数时,即使不能立即得到结果,该函数也不会阻塞当前线程,而是立即返回。
同步和异步属于通信模式,而阻塞和非阻塞属于套接字模式。在实现结果方面,同步和阻塞一致,异步和非阻塞一致。
阻塞模式:
1、阻塞写操作:
write()、send()、sendto()、sendmsg()
2、阻塞读操作:
read()、recv()、recvfrom()、recvmsg()
3、阻塞接收连接:
accept()
4、阻塞连接:
connect()
阻塞模式的特点:
优点:
1、结构简单
2、通信双方比较容易保持同步
3、编程逻辑简单,当函数成功返回时,则进程继续;否则,当函数返回错误时,检查错误类型,实施错误处理
缺点:
1、在读操作时进程可能永远阻塞,在读操作时,由于没有数据可读而产生阻塞后,假如对方主机崩溃,进程将无法接收到任何数据,从而产生永远的阻塞。其他操作一般不会永远阻塞,但可能阻塞的时间较长。
2、进程效率比较低。当进程阻塞在一个读进程时,必须等待读操作的返回,等待过程中不能进行其他的操作。如果一个进程同时从多个套接字读数据,只能串行进行:首先读第一个套接字,进程阻塞,等待套接字的数据到达。在此过程中,即使其他套接字有数据到达,进程也不能被唤醒,只能等到第一个套接字数据到达后被唤醒。
解决阻塞模式的效率的方法:
1、超时控制方法,能够防止进程阻塞时间过长。常用的控制方法是使用套接字选项设置函数SetSockOption()。此外还可以使用定时器。
2、套接字多路复用方法。Socket.Select(IList read,IList write,IList error,int microseconds);
select使用的情况:
(1)、当一个客户端需要同时处理多个文件描述符的输入/输出操作的时候(一般来说是标准的输入/输出和网络套接字),多路复用技术将会有机会得到使用。
(2)、当程序需要同时进行多个套接字的操作的时候
(3)、如果一个TCP服务器程序同时处理正在侦听网络连接的套接字和已经连接好的套接字。
(4)、如果一个服务器程序同时使用TCP和UDP协议。
(5)、如果一个服务器同时使用多种服务并且每种服务可能使用不同的协议
3、调用异步选择函数AsyncSelect ,调用之后,阻塞套接字立即进入异步非阻塞方式。
非阻塞模式:
1、非阻塞套接字:
Socket.Blocking = false;
2、异步套接字
采用异步回调(AsyncCallback)处理异步完成的而操作