Unix网络编程-TCP客户端服务器示例(1)这篇文章中的客户端回射函数如下
此版本的问题在于:当套接字上发生某件事情时,客户可能阻塞于fgets调用。新版本改为阻塞于select调用,或是等待标准输入可读,或是等待套接字可读。这样服务器进程一终止,客户就能马上得到通知。下面展示了调用select所处理的各种条件。
客户端的套接字上的三个条件处理如下:
1) 如果对端tcp发送数据,那么该套接字变为可读,并且read返回一个大于0的值(即读入数据的字节数)
2) 如果对端tcp发送一个FIN(对端进程终止),那么套接字变为可读,并且read返回0(EOF)
3) 如果对端TCP发送一个RST(对端主机崩溃并重新启动),那么该套接字变为可读,并且read返回-1,而errno中含有确切的错误码。
代码如下所示
调用select
我们只需要一个用于检查可读性的描述符集。该集合由FD_ZERO初始化,并且FD_SET打开两位:以为对应于标准I/O文件指针fp,一位对应于套接字sockfd。fileno函数把标准I/O文件指针转换为对应的描述符。select和poll只工作在描述符上。计算出两个描述符的较大值后,调用select。在该调用中写集合和异常集合指针都是空指针。最后一个参数也是空指针(时间限制),因为我们希望本调用阻塞到某个描述符就绪为止。