unp学习第五章

思而不学 思而不学     2022-10-15     247

关键词:

一、概述

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

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

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

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

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

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

 

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

 1 #include "unp.h"
 2 
 3 int
 4 main(int argc, char *argv[])
 5 {
 6     int listenfd, connfd;
 7     pid_t childpid;
 8     socklen_t clilen;
 9     struct sockaddr_in cliaddr, servaddr;
10 
11     listenfd = Socket(AF_INET, SOCK_STREAM, 0);
12 
13     bzero(&servaddr, sizeof(servaddr));
14     servaddr.sin_family = AF_INET;
15     servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
16     servaddr.sin_port = htons(SERV_PORT);
17     Bind(listenfd, (SA *)&servaddr, sizeof(servaddr));
18 
19     Listen(listenfd, LISTENQ);
20     for(;;) {
21         clilen = sizeof(cliaddr);
22         connfd = Accept(listenfd, (SA *)&cliaddr, &clilen);
23         if((childpid = Fork()) == 0) {          /* child process */
24             Close(listenfd);                    /* close listening socket */
25             str_echo(connfd);                   /* process the request */
26             exit(0);
27         }
28         Close(connfd);                          /* parent closes connected socket */
29     }
30 }

 

#include "unp.h"

void
str_echo(int sockfd)
{
    ssize_t n;
    char line[MAXLINE];
    for(;;) {
        if((n = Readline(sockfd, line, MAXLINE)) == 0)
            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 !=2)
        err_quit("usage:tcpcli <IPaddress>");
    sockfd = Socket(AF_INET, SOCK_STREAM, 0);

    bzero(&servaddr, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(SERV_PORT);
    inet_pton(AF_INET, argv[1], &servaddr.sin_addr);
    Connect(sockfd, (SA *)&servaddr, sizeof(servaddr));

    str_cli(stdin, sockfd);
    exit(0);
}

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) == 0)
            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。

 

第五章学习小结

查看详情

数据结构:第五章学习小结

            查看详情

第五章学习小结

一、知识框架   二、课堂疑问解答1、定义    ①typedefstruct  ②me:typedefstruct   chardata;chardata;intparent;intparent;Node;BiTNode;typedefstructintn;  查看详情

第五章学习小结

第五章树和二叉树中我学到的一,基本定义:树、二叉树、完美二叉树、偏二叉树,节点关系,树的深度,叶节点等等的定义二,树(二叉树)的基本储存结构(1)用数组,适用于满二叉树(2)链式结构(3)数组加链表式:双... 查看详情

solidity学习记录——第五章(代码片段)

Solidity学习记录第一章创建生产僵尸的工厂第二章设置僵尸的攻击功能第三章编写DAPP所需的基础理论第四章完善僵尸功能第五章ERC721标准和加密资产文章目录Solidity学习记录前言一、本章主要目的二、学习过程1.本节课程知识点2.... 查看详情

第五章学习小结

1.在第五章我们学习了树和二叉树相关的存储结构和相关操作,在之前我们学习的都是比较规则的一对一的线性结构,较为容易理解和操作,而树和二叉树的存储结构为一对多,意味着这个的相关操作又要更加的复杂。在这章我... 查看详情

第五章学习小结

1、第五章主要学习了与树相关的知识,从二叉树拓展到一棵普通的树,再从一棵普通的树拓展到哈夫曼树,再从树拓展到森林的概念。5-1节学习了树和二叉树的定义,对节点,根节点,叶子结点,深度,度等概念进行了初步的... 查看详情

第五章无向概率图模型学习

马尔科夫随机场(MarkovRandomFields,MRFs)MRFs与Gibbs分布等价。  条件随机场(ConditionalRandomFields,CRFs): CRFs的训练方法:迭代梯度法(IterativeScaling)和L-BFGS迭代梯度法包括:GIS(GeneralizedIterativeScaling),IIS(ImprovedIterat 查看详情

第五章学习小结(代码片段)

第五章学习了树与二叉树的相关知识,有二叉树及其存储结构,二叉树的前中后与层次遍历并且了解了哈夫曼树,最后学习了树与森林的转换。以下是其中的一道实践题,老师在课堂上详细的给出了解题方法7-2 深入虎穴 ... 查看详情

构建之法第五章学习

今天我学习了《构建之法》第五章团队和流程。首先我了解了写了再改模式(Code-and-Fix)史蒂夫·迈克康奈尔(SteveMcConnell)在这里提到了不少开发流程。第一个提到的开发流程。这个流程也有好处,不需要太多其他准备或相关... 查看详情

第五章学习小结(代码片段)

---恢复内容开始---第五章主要学习的是树与二叉树,有利用数组进行存储的顺序二叉树,也有利用链表进行存储的链式二叉树,在这个基础上又展开了二叉树的遍历。二叉树的遍历分为前序遍历,中序遍历以及后序遍历,主要区... 查看详情

第五章学习心得(代码片段)

第五章的中,我们学习了树和二叉树,相比前面的内容,我感觉这部分会难一点点,特别是树的存储结构,根据不同情况会有各种存储结构,如果理解不够深刻,在后面使用这个结构体来完成代码的时候就会遇到挺多麻烦的。在... 查看详情

安卓权威编程指南-第五章学习笔记(两个activity)

学习安卓编程权威指南第五章的时候自己写了个简单的Demo来加深理解两个Activity互相传递数据的问题,然后将自己的学习笔记贴上来,如有错误还请指正。 IntentActivityDemo学习笔记题目:ActivityA登录界面(用户名、密码、登陆... 查看详情

机器学习实战第五章logistic回归(代码片段)

defgradAscent(dataMatIn,classLabels):dataMatrix=mat(dataMatIn)#converttoNumPymatrixlabelMat=mat(classLabels).transpose()#converttoNumPymatrixm,n=shape(dataMatrix)alpha=0.001maxCycles=500weights=ones(( 查看详情

数据结构:第五章学习小结(代码片段)

第五章我们主要学习了树和二叉树的定义、性质、存储结构以及部分操作还有哈夫曼树。下图是我对本章所学知识的大致总结: 在这章的代码题中,我也学到了很多,其中Listleaves这题就有很多小细节:1.boolcheck[n]=false;//定义... 查看详情

第五章学习小结(代码片段)

  经过半个多学期的学习,终于从线性结构跨越到非线性结构了。  通过这一章的学习,我明白了原来非线性的逻辑结构也可以通过顺序存储方式反映出结点之间的逻辑关系。  当然,印象最深的还是深入虎... 查看详情

“全栈2019”java第五章:intellijidea代码自动提示

难度初级学习时间10分钟适合人群零基础开发语言Java开发环境JDKv11IntelliJIDEAv2018.3文章原文链接“全栈2019”Java第五章:IntelliJIDEA代码自动提示下一章“全栈2019”Java第六章:注释学习小组加入同步学习小组,共同交流与进步。方... 查看详情

第五章学习小结

本章学习了树和二叉树(树的结构定义是一个递归的定义,即在树的定义中又用到树的定义)1.树的定义:有且只有一个根节点,其余节点分为n个有限集,每个集合为根的子树,若只有根节点,称为只有根节点的树(分等级的分... 查看详情