加入收藏 | 设为首页 | 会员中心 | 我要投稿 源码门户网 (https://www.92codes.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

linux网络编程之socket(九) 使用select函数改进客户端/服务器端程序

发布时间:2016-09-21 05:31:57 所属栏目:Linux 来源:站长网
导读:一、当我们使用单进程单连接且使用readline修改后的客户端程序,去连接使用readline修改后的服务器端程序,会出 现一个有趣的现象,先来看输出: 先运行服务器
副标题[/!--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);
}

(编辑:源码门户网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读