启动服务器端程序
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信号。该信号的缺省行为被忽略。

套接口编程理论基础:正常启动相关推荐

  1. 第8章 基本UDP套接口编程

    TCP: 面向连接的,提供可靠的字节流. UDP: 无连接,不可靠的数据报协议. UDP: DNS 域名系统, NFS 网络文件系统, SNMP 简单网络管理协议. #include <sys/ ...

  2. UNIX网络编程读书笔记:套接口选项

    概述 有很多方法来获取和设置影响套接口的选项: getsockopt和setsockopt函数 fcntl函数 ioctl函数 getsockopt和setsockopt函数 这两个函数仅用于套接口. ...

  3. 网络编程学习笔记(基本套接口选项)

    SO_BROADCAST套接口选项: 此选项使能或禁止进程发送广播消息的能力.只有数据报套接口支持广播,并且还必须是在支持广播消息的网络上(例如以太网.令牌网).不能在一个点对点链路上进行广播. SO ...

  4. 网络编程学习笔记(套接口超时)

    有三种方法给套接口上的I/O操作设置 超时: 1.调用 alarm,在到达指定时间 时产生 SIGALRM信号,可能与进程中其他已有的alarm调用 冲突 2.使用select阻塞在等待I/O上,se ...

  5. 网络编程学习笔记(TCP套接口选项)

    其套接口级别为IPPROTO_TCP TCP_KEEPALIVE: 指定TCP开始发送保持存活探测分节前以秒为单位的连接空闲时间.此选项在SO_KEEPALIVE套接口选项打开时才有效 TCP_MAX ...

  6. 网络编程学习笔记(ICMPv6和IPv6套接口选项)

    ICMPv6套接口选项级别为IPPROTO_ICMPV6 ICMP6_FILTER: 获取和设置一个icmp6_filter结构,这指明256个可能的ICMPv6消息类型中哪一个传递给在原始套接口上的 ...

  7. 网络编程学习笔记(IPv4套接口选项)

    这些选项级别为IPPROTO_IP IP_HDRINCL: 如果此选项给一个原始IP套接口,必须为所有发判定以此原始套接口上的数据报构造自己的IP头部.一般情况下,内核为发送到原始套接口上的数据报构造 ...

  8. UNIX网络编程读书笔记:套接口地址结构

    前言 大多数套接口函数都需要一个指向套接口地址结构的指针作为参数.每个协议族都定义它自己的套接口地址结构.这些结构的名字均以"sockaddr_"开头,并以对应每个协议族的唯一后缀 ...

  9. 黑马java教程是什么_Java教程:揭秘什么是面向接口编程

    先用一个案例来给大家说明一下面向接口编程. 案例:有一个电脑类(Computer),电脑除了有基本的开机关机功能外,还有连接任何外接设备的功能,比如能电脑能连接外置键盘(Keyboard),鼠标(Mo ...

  10. 初识Django —Python API接口编程入门

    初识Django -Python API接口编程入门 一.WEB架构的简单介绍 Django是什么? Django是一个开放源代码的Web应用框架,由Python写成.我们的目标是用Python语言, ...

最新文章

  1. luogu P4408 [NOI2003]逃学的小孩(树的直径)
  2. ElasticSearch 索引 VS MySQL 索引
  3. 信息检索Information Retrieval评价指标
  4. Spring Boot——获取上传文件的MD5值解决方案
  5. 程序员编程艺术第一~十章集锦与总结(教你如何编程)--持续更新中
  6. Python 微信定向问好
  7. Linux概述及centos版本介绍和下载地址
  8. yum 安装包的用法
  9. 浅谈编程-----非计算机专业以及非培训班的一些感悟
  10. 【jQuery笔记Part1】09-jQuery操作css-尺寸
  11. aspose.cell for java 去水印_【Java编程基本功】(十)输出杨辉三角,输出*号,数组移动...
  12. JavaScript函数的4种调用方法详解
  13. Web前端性能优化的9大问题
  14. 双目视觉立体匹配算法
  15. Verilog CIC 滤波器设计(代码自取)
  16. STM32——EMWIN 字体(二十)
  17. 新浪微博开放平台php sdk,新浪微博开放平台
  18. [Spark中移动平均法的实现]
  19. 【转载】儒林外史人物——周进(二)
  20. C51模拟PS2键盘(一)

热门文章

  1. 神经网络与深度学习第2章:机器学习概述 阅读提问
  2. 快速突破面试算法之动态规划篇
  3. 手机辅助java脚本_android 手机一个辅助阅读工具
  4. SpaceNet 数据集
  5. 关于抽象和多态的总结
  6. Spring入门第六课
  7. 一起写一个Android图片轮播控件
  8. ASP.NET Ajax 实现无刷新分页
  9. xcode 4.0 以上版本安装新浪微博SDK
  10. 根据select的内容来批量修改一个表的字段