zoukankan      html  css  js  c++  java
  • 套接口编程理论基础:正常启动

    启动服务器端程序
    zhaoxj$ make tcpserv01
    gcc -I../lib -g -O2 -D_REENTRANT -Wall -c -o tcpserv01.o tcpserv01.c
    gcc -I../lib -g -O2 -D_REENTRANT -Wall -o tcpserv01 tcpserv01.o ../libunp.a -lpthread

    zhaoxj$ ./tcpserv01 &
    [1] 13424

    zhaoxj$ netstat -antp
    (并非所有进程都能被检测到,所有非本用户的进程信息将不会显示,如果想看到所有信息,则必须切换到 root 用户)激活Internet连接 (服务器和已建立连接的)
    Proto Recv-Q Send-Q  Local Address  Foreign Address      State    PID/Program name
    tcp     0     0      0.0.0.0:80             0.0.0.0:*    LISTEN    -
    tcp            0           0  0.0.0.0:9877             0.0.0.0:*    LISTEN    13424/tcpserv01
    tcp            0           0 127.0.0.1:631            0.0.0.0:*    LISTEN

    查看tcp连接的监听套接口,发现有三个套接口处于LISTEN状态,其中本地端口为9877正是我们启动的服务器应用

    启动客户端程序(再打开一个终端)
    zhaoxj$ make tcpcli01
    gcc -I../lib -g -O2 -D_REENTRANT -Wall -c -o tcpcli01.o tcpcli01.c
    gcc -I../lib -g -O2 -D_REENTRANT -Wall -o tcpcli01 tcpcli01.o ../libunp.a -lpthread

    zhaoxj$ ./tcpcli01 127.0.0.1

    通过三次握手,连接建立。接着发生的步骤:
    1.客户端调用str_cli 函数,该函数将阻塞于fgets调用。因为我们还没键入一行文本
    2.当服务器中的accept返回时,服务器调用fork,再由子进程调用str_echo。str_echo调用readline,readline调用read,
    read在等待客户送入一行文本期间阻塞
    3.另一方面,服务器父进程再次调用accept并阻塞,等待下一个客户连接

    zhaoxj$ netstat -antp
    (并非所有进程都能被检测到,所有非本用户的进程信息将不会显示,如果想看到所有信息,则必须切换到 root 用户)激活Internet连接 (服务器和已建立连接的)
    Proto  Recv-Q     Send-Q     Local Address    Foreign Address     State     PID/Program name
    tcp            0            0             0.0.0.0:80              0.0.0.0:*   LISTEN                         -
    tcp     0     0         0.0.0.0:9877              0.0.0.0:*   LISTEN        13424/tcpserv01
    tcp     0     0       127.0.0.1:631       0.0.0.0:*   LISTEN                             -
    tcp     0     0     127.0.0.1:9214     127.0.0.1:9877 ESTABLISHED    13525/tcpcli01
    tcp     0     0     127.0.0.1:9877     127.0.0.1:9214 ESTABLISHED 13526/tcpserv01
    tcp6     0            0             ::1:631                          :::*   LISTEN                       -

      第二个ESTABLISHED的本地端口号为9877,可判断出其对应服务器子进程的套接口;第一个ESTABLISHED的本地端口号是9214,可判断出其对应客户进程的套接口。

    zhaoxj$ ./tcpcli01 127.0.0.1
    hello,world
    hello,world
    good bye
    good bye
    ^D                 <Ctr-D>结束客户终端

    此时立即执行netstat命令 可看到如下结果:
    zhaoxj$ netstat -antcp|grep 9877
    tcp   0   0       0.0.0.0:9877        0.0.0.0:*       LISTEN   13424/tcpserv01
    tcp   0   0   127.0.0.1:9214   127.0.0.1:9877        TIME_WAIT     -
    tcp   0   0       0.0.0.0:9877        0.0.0.0:*       LISTEN   13424/tcpserv01
    tcp   0   0   127.0.0.1:9214   127.0.0.1:9877       TIME_WAIT     -

    当前连接的客户端(本地端口号9214)进入了TIME_WAIT状态,而监听服务器仍在等待另一个客户连接。
    正常终止客户和服务器的步骤:
    1.当我们键入<Ctr-D>EOF字符时,fgets返回一个空指针,str_cli函数返回。
    2.当str_cli返回到客户的main函数时,main通过exit终止。
    3.进程终止时的一部分操作是关闭所有打开的描述字,客户打开的描述字由内核关闭。这导致客户tcp发送一个FIN给服务器,服务器TCP则以ACK响应,这是TCP连接终止的前半部操作。至此,服务器接口处于CLOSE_WAIT状态,客户套接口处于FIN_WAIT_2状态。
    4.当服务器TCP接受FIN时,服务器子进程阻塞于readline调用,于是readline返回0.这导致str_echo函数返回服务器子进程的main函数
    5.服务器子进程通过调用exit来终止。
    6.服务器子进程打开的所有描述字随之关闭。由子进程关闭已连接套接口引发TCP连接终止序列最后两个分节:一个是从服务器到客户的FIN;另一个是从客户到服务器的ACK。至此,连接完全终止,客户套接口进入TIME_WAIT状态
    7.进程终止处理的另一部分内容是:在服务器子进程终止时,会给父进程发送一个SIGCHLD信号。该信号的缺省行为被忽略。

  • 相关阅读:
    VS2010、SQL Server 2008和SQL Server 2012安装详解
    IIS服务寄宿
    C#中错误:不包含适合于入 口点的静态“Main”方法 的解决方法
    硬件的一些性能指标
    SATA SAS SSD 硬盘介绍和评测
    mysql数据库锁定机制
    mysql日志设置优化
    MySQL硬件瓶颈分析
    可扩展性设计之数据切分
    硬件环境对系统性能的影响
  • 原文地址:https://www.cnblogs.com/polestar/p/2405633.html
Copyright © 2011-2022 走看看