1、阻塞模式概念
当使用socket()函数和WSASocket()函数创建的套接字时,默认都是阻塞模式的。阻塞模式是指套接字在执行操作时,调用函数在没有完成操作之前不会立即返回的工作模式。这意味着当调用Windows Sockets API不能立即完成时,线程处于等待窗台,直到操作完成。
并不是所有的Windows Sockets API以阻塞套接字为参数调用都会发生阻塞。例如,以阻塞模式的套接字为参数调用bind()、listen()时,函数会立即返回。这里将可能阻塞套接字的Windows Sockets API调用分为以下四种:
A、输入操作
recv()、recvfrom()、WSARecv()、WSARecvfrom()函数。以阻塞套接字模式为参数调用这些函数接受数据,如果此时套接字缓冲区没有数据可读,则调用线程在数据到来前一直睡眠。
B、输出操作
send()、sendto()、WSASend()、WSASendto()函数。以阻塞套接字模式为参数调用这些函数发送数据,如果套接字缓冲区没有可用空间,线程会一直睡眠,直到有空间。
C、接受连接
accept()、WSAAcept()函数。以阻塞套接字模式为参数调用这些函数,将等待 接受对方连接请求,如果此时没有连接请求,线程就会进入睡眠状态。
D、外出连接
connect()、WSAConnect()函数。对于TCP连接,客户端以阻塞套接字为参数,调用这些函数向服务器发连接。该函数在收到服务器的应答前,不会返回。这意味着TCP连接总会等待至少从客户端到服务器的一次往返的时间。
2、阻塞模式的优势与不足
使用阻塞模式的套接字开发网络程序比较简单,容易实现。当希望能够立即发送和接受数据,且处理的套接字数量较少的情况下。使用阻塞套接字模式来开发网络程序比较合适。
而不足之处表现为,在大量建立好的套接字线程之间进行通讯时比较困难。当希望同时处理大量套接字时,将无从下手,扩展性差。
3、C++源码
将书本上本章节的理论知识认真的看了半个晚上,被过滤一下也就只有这么多了。看源码也许会更容易理解吧!
(短短两三五百行代码,居然敲了近两个小时,实在不敢恭维打字速度....)
4、程序运行效果
源代码在VC6.0 + WIN XP SP2环境下编程运行正常:
5、源代码下载地址
http://download.csdn.net/source/1679786