inetd服务是linux开机初始化由rc程序启动的一项守护进程,它通过监听端口来启动各项服务,流程 tcp/udp服务---->(5000端口来信)---->inted发现有来信----->启动相应的服务程序, 也就是说inted服务器充当一个功能就是创建socket服务端的前半段,即创建socket---->bind(端口)---->监听---->accept(接受信号),当来一个此端口的请求,他会fork+exec来执行相对应的服务程序.下面通过一个小例子还说明inetd服务的流程:
①. 首先在 /etc/inetd.conf 文件中的最后一行加入
ma streamtcp
nowaitroot
/home/human/bb xiao
tip: 这几个参数是用tab键分开的,这个inetd.conf文件是inetd服务器的配置文件,配置好了之后需要重启一下才能生效
首先开机启动的时候,rc启动inetd服务,此服务会读取inetd.conf文件中的每一行来进行监听,比如这一行,他会读取第一个参数 ma,发现是ma服务
然后它会在 /etc/service文件中找 ma服务所对应的端口,所以我们事先也要在/etc/service文件中填入一行 ma 6234/tcp
接着有读取了 第二第三个参数, 之后创建socket,bind,listen, accept,第四个参数的意思就是创建子进程后父进程不用等待直接可以接受此端口接受到的下一个命令
所以 accept 之后就是fork+exec,其中 exec中的启动函数是第五个参数/home/human/bb 名字叫bb的进程,第六个参数xiao不清楚,没有试验出来...
其中程序bb的源码非常简单如下:
#include <stdio.h> #include <string.h> int main(int argc, char *argv[]) { FILE *fp; system("echo hello >> /home/human/ma.txt"); return 0; }
这里就是网文件中打印一句话
之后创建访问程序(tcp)
#include <sys/types.h> #include <sys/socket.h> #include <stdio.h> #include <arpa/inet.h> #include <netdb.h> #include <string.h> #include <stdlib.h> #define BUFLEN 255 #define SOCKADDR struct sockaddr #define SERVER_PORT 6234 int main(int argc, char** argv) { struct sockaddr_in servaddr; int sockfd, n, flag; int num1, num2; char buffer[BUFLEN]; char errmsg[] = "Server does not function. /n"; struct hostent *hp; if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { printf("socket creating error!/n"); exit(1); }; memset(&servaddr, 0, sizeof(struct sockaddr_in)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(SERVER_PORT); servaddr.sin_addr.s_addr=htonl(INADDR_ANY); if(connect(sockfd, (struct sockaddr *)(&servaddr), sizeof(struct sockaddr_in)) <0 ) { printf("Connection Failure!/n"); exit(3); } }
结束语:顺便提一下为什么会有inetd服务器的原因,因为如果没有的话,假设在系统中有10个请求服务端,然后就会创建10个接受进程来接受服务,这样系统就多了10个进程,那么如果没有请求来的话这10个进程还在挂起状态,严重的浪费了系统的资源, 所以人们就想用一个进程来做监听,所以就出来了个inetd服务器的东西,就是说它读取/etc/inetd.conf文件读取10个进程的服务项,然后创建socket等等,这样系统中只是一个进程在挂起,来请求时,就调用相应的任务进程即可,这样节省了系统的资源