章节5.1-5.7

发布时间:2022-06-23 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了章节5.1-5.7脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

今天学习了一下UNIX socket编程第五章节5.1-5.7的内容-TCP回射server-client程序,这篇文章的目的主要是记录一些实验截图,加强记忆。

 服务器代码:

#include <unp.h>

voidstr_echo(int sockfd){   ssize_t n;   char buf[MAXLINE];

again:   while ((n = read(sockfd, buf, MAXLINE)) > 0)     Writen(sockfd, buf, n);

  if (n < 0 && errno == EINTR)     goto again;   else if (n < 0)     err_sys("str_echo: read error");}

intmain(int argc, char **argv){   int listenfd, connfd;   pid_t childpid;   socklen_t clilen;   struct sockaddr_in cliaddr, servaddr;

  listenfd = Socket(AF_INET, SOCK_STREAM, 0);

  bzero(&servaddr, sizeof(servaddr));   servaddr.sin_family = AF_INET;   servaddr.sin_addr.s_addr = htonl(INADDR_ANY);   servaddr.sin_port = htons(6001);

  Bind(listenfd, (SA *)&servaddr, sizeof(servaddr));

  Listen(listenfd, LISTENQ);   for ( ; ; ) {     clilen = sizeof(cliaddr);     connfd = Accept(listenfd, (SA*)&cliaddr, &clilen);     if ((childpid = fork()) == 0) {     Close(listenfd);     str_echo(connfd);     exit(0);     }   Close(connfd);   }}

客户端代码:

#include "unp.h"

voidstr_cli(FILE *fp, int sockfd){   char sendline[MAXLINE], recvline[MAXLINE];

  while (Fgets(sendline, MAXLINE, fp)) {     Writen (sockfd, sendline, strlen(sendline));

    if (Readline(sockfd, recvline, MAXLINE) == 0 )       err_quit("str_cli:serv terminated prematurely");

    Fputs(recvline, stdout);   }}

intmain(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(6001);   Inet_pton(AF_INET, argv[1], &servaddr.sin_addr);

  Connect(sockfd, (SA *)&servaddr, sizeof(servaddr));

  str_cli(stdin, sockfd);

  exit(0);}

1.正常启动:

章节5.1-5.7

我们可以看到途中圈红的就是需要关注的一些信息:

PID和PPID的关系:子进程的PPID是父进程的PID,我们就可以看出PID为22030的进程是PID为21540进程的子进程.

 

STAT列的含义如下:

D 不可中断的休眠。通常是IO。

R 运行。正在运行或者在运行队列中等待。

S 休眠。在等待某个事件,信号。

T 停止。进程接收到信息SIGSTOP,SIGSTP,SIGTIN,SIGTOU信号。

W paging,在2.6之后不用。

X 死掉的进程,不应该出现。

Z 僵死进程。

通常还会跟随如下字母表示更详细的状态。

< 高优先级

N 低优先级

L 有pages在内存中locked。用于实时或者自定义IO。

s 进程领导者,其有子进程。

l 多线程

+ 位于前台进程组。

还有一些其他不常见的状态,遇到再添加说明。

WCHAN含义:

就上图的服务器而言:

Linux在进程阻塞于acceptconnect时,输出wait_for_connect(书中是这么写的,但是这边是inet_csk_accept,应该是阻塞在accept);

Linux在进程阻塞于套接字输入或输出时,输出sk_wait_data;

就上图的客户端而言:

Linux在进程阻塞于客户端I/O时,输出n_tty_read;

 

正常终止:

章节5.1-5.7

 

这边可以看到客户端状态已经进入TIME_WAIT。

这边还是四次挥手的一个过程:

客户TCP发送一个FIN字节给服务器,服务器则以一个ACK响应,到这一步服务器套接字就处于CLOSE_WAIT状态,客户端套接字则处于FIN_WAIT_2状态。这是TCP连接终止序列的前半部分。

后半部分则是在服务器子程序在接收到来自客户端的FIN分节,他就会关闭已连接的套接字,这时会引发TCP连接终止的最后两个分节:一个从服务器发往客户端的FIN分节和一个从客户端发往服务器的ACK分节。至此,连接全部终止,客户端状态则进入TIME_WAIT

状态。

 

借鉴文章:(18条消息) ps命令中STAT列表达的含义_枫竹梦的博客-CSDN博客_ps stat

章节5.1-5.7

 

脚本宝典总结

以上是脚本宝典为你收集整理的章节5.1-5.7全部内容,希望文章能够帮你解决章节5.1-5.7所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: