linux网络编程之socket(九) 使用select函数改进客户端/服务器端程序
副标题[/!--empirenews.page--] 一、当我们使用单进程单连接且使用readline修改后的客户端程序,去连接使用readline修改后的服务器端程序,会出 现一个有趣的现象,先来看输出: 先运行服务器端,再运行客户端, simba@ubuntu:~/Documents/code/linux_programming/UNP/socket$ ./echoser_recv_peek recv connect ip=127.0.0.1 port=54005 simba@ubuntu:~/Documents/code/linux_programming/UNP/socket$ ./echocli_recv_peek local ip=127.0.0.1 port=54005 可以先查看一下网络状态, simba@ubuntu:~$ netstat -an | grep tcp | grep 5188 tcp 0 0 0.0.0.0:5188 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:54005 127.0.0.1:5188 ESTABLISHED tcp 0 0 127.0.0.1:5188 127.0.0.1:54005 ESTABLISHED 可以看出建立了连接,服务器端有两个进程,一个父进程处于监听状态,另一子进程正在对客户端进行服务 。 再ps 出服务器端的子进程,并kill掉它, simba@ubuntu:~$ ps -ef | grep echoser simba 4549 3593 0 15:57 pts/0 00:00:00 ./echoser_recv_peek simba 4551 4549 0 15:57 pts/0 00:00:00 ./echoser_recv_peek simba 4558 4418 0 15:57 pts/6 00:00:00 grep --color=auto echoser simba@ubuntu:~$ kill -9 4551 这时再查看一下网络状态, simba@ubuntu:~$ netstat -an | grep tcp | grep 5188 tcp 0 0 0.0.0.0:5188 0.0.0.0:* LISTEN tcp 1 0 127.0.0.1:54005 127.0.0.1:5188 CLOSE_WAIT tcp 0 0 127.0.0.1:5188 127.0.0.1:54005 FIN_WAIT2 来分析一下,我们将server子 进程 kill掉,则其终止时,socket描述符会自动关闭并发FIN段给client,client收到FIN后处于CLOSE_WAIT状态, 但是client并没有终止,也没有关闭socket描述符,因此不会发FIN给 server子进程,因此server 子进程的TCP连接处于 FIN_WAIT2状态。 为什么会出现这种情况呢,来看client的部分程序: void do_echocli(int sock) { char sendbuf[1024] = {0}; char recvbuf[1024] = {0}; while (fgets(sendbuf, sizeof(sendbuf), stdin) != NULL) { writen(sock, sendbuf, strlen(sendbuf)); int ret = readline(sock, recvbuf, sizeof(recvbuf)); //按行读取 if (ret == -1) ERR_EXIT("readline error"); else if (ret == 0) //服务器关闭 { printf("server closen"); break; } fputs(recvbuf, stdout); memset(sendbuf, 0, sizeof(sendbuf)); memset(recvbuf, 0, sizeof(recvbuf)); } close(sock); } (编辑:源码门户网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |