一、概述

想要写一个完整的TCP客户-服务器程序例子,有下面功能的回射服务器

1.客户从标准输入读一行文本,写到服务器上;

2.服务器从网络输入读此行,并回射给客户;

3.客户读此回射行并写到标准输出。

此例子需要观察:正常运行时什么情况,客户和服务器都启动时什么情况,客户正常终止时什么情况,

如果服务器在客户之前终止客户什么情况,如果服务器主机崩溃则客户什么情况。

二、TCP回射服务器程序:main函数

 #include "unp.h"

 int
main(int argc, char *argv[])
{
int listenfd, connfd;
pid_t childpid;
socklen_t clilen;
struct sockaddr_in cliaddr, servaddr; listenfd = Socket(AF_INET, SOCK_STREAM, ); bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(SERV_PORT);
Bind(listenfd, (SA *)&servaddr, sizeof(servaddr)); Listen(listenfd, LISTENQ);
for(;;) {
clilen = sizeof(cliaddr);
connfd = Accept(listenfd, (SA *)&cliaddr, &clilen);
if((childpid = Fork()) == ) { /* child process */
Close(listenfd); /* close listening socket */
str_echo(connfd); /* process the request */
exit();
}
Close(connfd); /* parent closes connected socket */
}
}
#include "unp.h"

void
str_echo(int sockfd)
{
ssize_t n;
char line[MAXLINE];
for(;;) {
if((n = Readline(sockfd, line, MAXLINE)) == )
return; /* connection closed by other end */
Writen(sockfd, line, n);
}
}

三、TCP回射客户程序:main函数

#include "unp.h"

int
main(int argc, char *argv[])
{
int sockfd;
struct sockaddr_in servaddr; if(argc !=)
err_quit("usage:tcpcli <IPaddress>");
sockfd = Socket(AF_INET, SOCK_STREAM, ); bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(SERV_PORT);
inet_pton(AF_INET, argv[], &servaddr.sin_addr);
Connect(sockfd, (SA *)&servaddr, sizeof(servaddr)); str_cli(stdin, sockfd);
exit();
}

str_cli:

#include "unp.h"

void
str_cli(FILE *fp, int sockfd)
{
char sendline[MAXLINE], recvline[MAXLINE];
while(Fgets(sendline, MAXLINE, fp) != NULL) {
Writen(sockfd, sendline, strlen(sendline));
if(Readline(sockfd, recvline, MAXLINE) == )
err_quit("str_cli:server terminated prematurely");
Fputs(recvline, stdout);
}
}

四、正常终止

正常终止客户和服务器的步骤:

1.当我们键入EOF字符时,fgets返回一个空指针,于是str_cli返回。

2.当str_cli返回到客户的函数main时,main通过调用exit终止。

3.进程终止处理的一部分是关闭所有打开的描述字,所以客户套接口由内核关闭。

TCP连接终止的前半部分:客户TCP发送一个FIN给服务器,服务器TCP则ACK响应。

此时,服务器套接口处于CLOSE_WAIT状态,客户套接口处于FIN_WAIT_2状态。

4.当服务器TCP接收FIN时,服务器子进程阻塞于readline调用,于是readline返回0,这导致函数str_echo返回服务器子进程的main

5.服务器子进程通过调用exit来终止。

6.服务器子进程中打开的所有描述字随之关闭。由子进程来关闭已连接套接口引发TCP连接终止序列的最后两个分节:一个从服务器到客户的FIN和一个从客户到服务器的ACK。至此,连接完全终止,客户套接口进入TIME_WAIT状态。

7.进程终止处理的另一部分是在服务器子进程终止时给父进程发一个信号SIGCHLD。

UNP学习第五章的更多相关文章

  1. UNP学习第五章(二)

    一.POSIX信号处理 信号:告知某进程发生了某个事件的通知(软中断),通常是异步的. 信号可以:由进程发给另一个进程,由内核发给某个进程. 设置信号处理办法,有三个选择: 1.写一个函数,在信号发生 ...

  2. Java基础知识二次学习--第五章 数组

    第五章 数组 时间:2017年4月26日15:11:30~2017年4月26日15:15:54 章节:05章_01节  视频长度:09:30 内容:一维数组的内存分析 心得: Java中数组是引用类型 ...

  3. C#高级编程 (第六版) 学习 第五章:数组

    第五章 数组 1,简单数组 声明:int[] myArray; 初始化:myArray = new int[4]; 为数组分配内存. 还可以用如下的方法: int[] myArray = new in ...

  4. C语言学习第五章

    今天要进行一个重要元素数组的学习了.这一章要掌握什么是数组,数组怎么样命名,数组怎么样使用,以及一些常见的错误和需要注意的事项. 一.      数组的基本概念 数组是可以在内存中连续存储多个元素的结 ...

  5. 深度学习框架PyTorch一书的学习-第五章-常用工具模块

    https://github.com/chenyuntc/pytorch-book/blob/v1.0/chapter5-常用工具/chapter5.ipynb 希望大家直接到上面的网址去查看代码,下 ...

  6. UNP学习第三章

    一.主机字节序和网络字节序 转换时用到下列四个函数: #include <netinet/in.h> uint16_t htons(uint16_t host16bitvalue); ui ...

  7. Artech的MVC4框架学习——第五章Model的绑定

    第一Model绑定本质就是为目标Action方法生成参数列表的过程,参数数据存在于http请求.请求的 URL .消息报头或主体中. 第二aciton 参数的元数据通过 ParameterDescri ...

  8. Python爬虫学习==>第五章:爬虫常用库的安装

    学习目的: 爬虫有请求库(request.selenium).解析库.存储库(MongoDB.Redis).工具库,此节学习安装常用库的安装 正式步骤 Step1:urllib和re库 这两个库在安装 ...

  9. java并发学习第五章--线程中的锁

    一.公平锁与非公平锁 线程所谓的公平,就是指的是线程是否按照锁的申请顺序来获取锁,如果是遵守顺序来获取,这就是个公平锁,反之为非公平锁. 非公平锁的优点在于吞吐量大,但是由于其不是遵循申请锁的顺序来获 ...

随机推荐

  1. ARGB色彩模式

    看到#ff ff ff 00 00这种 就是啦 .开头两位表示透明度.

  2. 全面质量管理体系运转的基本方法 PDCA

    PDCA管理循环 PDCA循环作为全面质量管理体系运转的基本方法,其实是需要搜集大量数据资料,并综合运用各种管理技术和方法.全面质量管理活动的全部过程,就是质量计划的制订和组织实现的过程,这个过程就是 ...

  3. [CSP-S模拟测试]:kill(二分答案+贪心)

    题目传送门(内部题50) 输入格式 第一行包含四个整数$n,m,s$,表示人数.怪物数及任务交付点的位置.第二行包含$n$个整数$p_1,p_2,...,p_n$.第三行包含$n$个整数$q_1,q_ ...

  4. (一)arm交叉编译工具链准备

    1.背景 arm机器一般因为资源问题进行编译会影响开发速度,而且很多时候因为资源不够而无法完成编译工作.因此,需要在执行机上进行交叉编译,即使用x86或其他架构机器基于交叉编译工具编译出在arm上可以 ...

  5. TestStack.White安装详解

    一.安装 NuGet TestStack.White是通过NuGet进行安装的.NuGet最低支持VS2010.我使用的VS2015. 安装方式一 :从Visual Studio的工具->扩展和 ...

  6. python读取mysql返回json

    python内部是以tuple格式存储的关系型数据库的查询结果,在实际的使用过程中可能需要转换成list或者dict,json等格式.在这里讲解如何将查询的结果转成json字符串.这里需要导入nump ...

  7. linux目录及文件命令学习

    学习Linux 目录操作 1.pwd 可以看当前目录路径 2.cd change directory 改变目录,切换目录 cd / 进入跟目录 cd ..返回上级目录 cd 进入用户主目录 cd .. ...

  8. UVA10271_Chopsticks

    Chopsticks 大致就是有一堆筷子,知道了他们的长度,现在选长度为abc的三个筷子a<=b<=c为一对筷子,质量为(a-b)平方,现在选k双这样的筷子,求质量最小 思路: 第一次看到 ...

  9. mybatis关联查询之一对多查询

    一对多,是最常见的一种设计.就是 A 表的一条记录,对应 B 表的多条记录,且 A 的主键作为 B 表的外键.这主要看以哪张表为中心,下面的测试数据中,从employee 表来看,一个员工对应一个部门 ...

  10. nginx方向代理详解及配置

    一代理服务器1.代理服务器,客户机在发送请求时,不会直接发送给目的主机,而是先发送代理服务器,代理服务器接受客户机请求之后,在向主机发出,并接受目的主机返回的数据,存放在代开服务器的硬盘中,在发送给客 ...