场景介绍我们考虑一个简单的客户端-服务器通信场景,其典型模式是:服务器通过close()主动关闭一个TCP连接。客户端通过read()获取到0(表示服务端没有数据),调用close()关闭连接。在TCP层面,表现为:服务端调用close()后,发送一个FIN给客户端,客户端回应一个FIN-ACK。服务器进入FIN-WAIT-2状态,客户端进入CLOSE-WAIT状态。客户端调用close()后,向服务器发送FIN,服务器会使用FIN-ACK。服务器进入TIME-WAIT状态,客户端直接进入CLOSE状态,连接结束。我们考虑一些异常情况,在客户端:客户端获取到read()==0后没有及时调用close();客户端获取到read()==0后仍然向服务端写入数据。测试程序使用《UNIX网络编程》(第一卷)中的server-client示例程序。服务器部分:intmain(intargc,char**argv){intlistenfd,connfd;socklen_tlen;structsockaddr_inservaddr,cliaddr;字符buff[MAXLINE];time_t滴答作响;listenfd=Socket(AF_INET,SOCK_STREAM,0);bzero(&servaddr,sizeof(servaddr));servaddr.sin_family=AF_INET;servaddr.sin_addr.s_addr=htonl(INADDR_ANY);servaddr.sin_port=htons(9999);/*白天服务器*/Bind(listenfd,(SA*)&servaddr,sizeof(servaddr));听(listenfd,LISTENQ);对于(;;){len=sizeof(cliaddr);connfd=Accept(listenfd,(SA*)&cliaddr,&len);printf("connectionfrom%s,port%d\n",Inet_ntop(AF_INET,&cliaddr.sin_addr,buff,sizeof(buff)),ntohs(cliaddr.sin_port));滴答声=t时间(空);snprintf(buff,sizeof(buff),"%.24s\r\n",ctime(&ticks));写(connfd,buff,strlen(buff));关闭(connfd);}}server监听9999端口,建立新连接后,发送当前时间,然后调用close()关闭连接客户端部分:intmain(intargc,char**argv){intsockfd,n;socklen_tlen;字符recvline[MAXLINE+1];structsockaddr_inservaddr,cliaddr;if(argc!=2)err_quit("usage:a.out
