一、套接字
windows套接字Socket是进程通信的一种方式,可以实现在不同主机的相关进程之间交换数据。在TCP/IP网络应用中,通信的两个进程的主要模式是客户/服务器(C/S)模式,即客户向服务器发出请求,服务器接受到请求后,提供相应的服务。
二、套接字函数
1. 创建套接字 socket
2. 绑定本地地址 bind
3. 监听连接 listen
4. 建立套接字连接 connect 与 accept
5. 数据传输 send 与 recv
6. 关闭套接字 closesocket
三、套接字工作模式 阻塞模式和非阻塞模式
在阻塞模式下,在I/O操作完成前,执行的操作函数一直等待而不立即返回,该函数所在的线程会阻塞在这里。举例说明,当调用recv函数,系统首先检查是否有数据准备好数据,如果数据没有准备好,那么系统就处于等待状态。当数据准备好后,将数据从系统缓冲区COPY到用户空间,然后该函数返回。使用阻塞模式的套接字开发简单,不多介绍。
在非阻塞模式下,执行的操作函数会立即返回,而不管I/O是否完成,该函数所在线程会继续运行。该操作函数返回错误代码(WSAEWOULDBLOCK)。举例,一个非阻塞模式套接字多次调用recv函数,前几次调用recv函数时,系统数据还没有准备好,因此该函数返回WSAEWOULDBLOCK错误代码,最后一次调用recv()函数时,数据已经准备好,被复制到应用程序的缓冲区中,recv()函数返回成功。
套接字设置为非阻塞模式后,在调用Windows Sockets API函数时,调用函数会立即返回。大多数情况下,这些函数调用都会调用“失败”,并返回WSAEWOULDBLOCK错误代码。说明请求的操作在调用期间内没有时间完成。通常,应用程序需要重复调用该函数,直到获得成功返回代码。
若循环去调用recv函数,会造成系统发给应用程序的消息丢失,而是应该采用WSAEventSelect和WSAAsynSelect 模型,当有FD_READ时,数据已经是在系统的缓冲区,再调用recv。
四、代码示例
1、设置非阻塞模式
2. 非阻塞模式 套接字连接 connect
3. 非阻塞模式 接受数据 recv
4. 非阻塞模式 发送数据 send
若需要完整代码,请联系QQ 295984486