Unix网络编程-select模型重写客户端回射函数

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。在该调用中写集合和异常集合指针都是空指针。最后一个参数也是空指针(时间限制),因为我们希望本调用阻塞到某个描述符就绪为止。

你可能感兴趣的:(Unix网络编程-select模型重写客户端回射函数)