初值:无函数定义:void sig_chld(int)
函数定义体:空
变量定义:
listenfd, connfd: 整型
childpid: pid_t 类型
clilen: socklen_t 类型
cliaddr, servaddr: sockaddr_in 类型
开始执行:
listenfd = 调用函数 Socket(AF_INET, SOCK_STREAM, 0) 得到整型结果
servaddr 赋值为一个全是 0 的 sockaddr_in 类型变量
servaddr.sin_family 赋值为 AF_INET
servaddr.sin_addr.s_addr 赋值为 INADDR_ANY 的网络字节序
servaddr.sin_port 赋值为 SERV_PORT 的网络字节序
调用函数 Bind(listenfd, (SA *) &servaddr, sizeof(servaddr)) 绑定端口
调用函数 Listen(listenfd, LISTENQ) 监听端口
signal(SIGCHLD, sig_chld) 注册子进程结束信号处理函数
进入无限循环:
clilen 赋值为 cliaddr 结构体的大小
调用函数 accept(listenfd, (SA *) &cliaddr, &clilen) 等待连接请求,得到连接套接字 connfd
如果 connfd 小于 0(accept 函数出错):
如果错误码是 EINTR(中断错误),则继续循环
否则,调用函数 err_sys("accept error"),程序退出
如果成功得到连接套接字 connfd:
调用函数 Fork(),得到子进程的 pid_t 值 childpid
如果 childpid 是 0(新建的子进程):
关闭监听套接字 listenfd
调用函数 str_echo(connfd),处理连接请求
调用函数 Close(connfd),关闭连接套接字
退出子进程
如果 childpid 是 -1(创建子进程错误),则调用函数 err_sys("fork error"),程序退出
如果 childpid 是其他值(父进程),则关闭连接套接字 connfd
函数结束。
函数定义体:空
变量定义:
listenfd, connfd: 整型
childpid: pid_t 类型
clilen: socklen_t 类型
cliaddr, servaddr: sockaddr_in 类型
开始执行:
listenfd = 调用函数 Socket(AF_INET, SOCK_STREAM, 0) 得到整型结果
servaddr 赋值为一个全是 0 的 sockaddr_in 类型变量
servaddr.sin_family 赋值为 AF_INET
servaddr.sin_addr.s_addr 赋值为 INADDR_ANY 的网络字节序
servaddr.sin_port 赋值为 SERV_PORT 的网络字节序
调用函数 Bind(listenfd, (SA *) &servaddr, sizeof(servaddr)) 绑定端口
调用函数 Listen(listenfd, LISTENQ) 监听端口
signal(SIGCHLD, sig_chld) 注册子进程结束信号处理函数
进入无限循环:
clilen 赋值为 cliaddr 结构体的大小
调用函数 accept(listenfd, (SA *) &cliaddr, &clilen) 等待连接请求,得到连接套接字 connfd
如果 connfd 小于 0(accept 函数出错):
如果错误码是 EINTR(中断错误),则继续循环
否则,调用函数 err_sys("accept error"),程序退出
如果成功得到连接套接字 connfd:
调用函数 Fork(),得到子进程的 pid_t 值 childpid
如果 childpid 是 0(新建的子进程):
关闭监听套接字 listenfd
调用函数 str_echo(connfd),处理连接请求
调用函数 Close(connfd),关闭连接套接字
退出子进程
如果 childpid 是 -1(创建子进程错误),则调用函数 err_sys("fork error"),程序退出
如果 childpid 是其他值(父进程),则关闭连接套接字 connfd
函数结束。