亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 服務器 > Web服務器 > 正文

介紹守護進程XINETD與SOCKET程序的含義

2024-09-01 13:42:43
字體:
來源:轉載
供稿:網友

1.Xinetd提供被動式的超級服務

  也就是服務程序是被使用端所啟動,平時則無須存在。例如,ftp, telnetd, pop3,imap, auth等等,這些服務沒有人使用時,無須啟動。此外,xinetd將socket轉換成stdin/stdout,因而使得網路服務程式設計大大簡化,您可以只用printf及fgets便可完成處理很復雜的網路協定。


2.一個簡單的服務程序 goodie

 

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>

char *cmds[]={ 
"help", 
"say", 
"hello", 
"bye", 
"exit", 
NULL 
};

int getcmd(char *cmd) 

int n=0; 
while (cmds[n]!=NULL) { 
if (strncasecmp(cmd,cmds[n],strlen(cmds[n]))==0) return n; 
n++; 

return -1; 
}

void main(void) 

char buf[1024]; 
int ok;

printf("Welcome to goodie service! "); 
fflush(stdout);

ok=0; 
do { 
while (fgets(buf,1023,stdin)==NULL); 
switch (getcmd(buf)) { 
case -1: printf("Unknown command! "); break; 
case 0:
           printf("How may I help you, sir? ");
            int j=0;
           while(cmds[j++]!=NULL)printf(” %s/t/t“,cmds[j-1]);
           break; 
case 1: printf("I will say %s",&buf[3]); break; 
case 2: printf("How're you doing today? "); break; 
case 3: printf("Si ya, mate! "); ok=1; break; 
case 4: printf("Go ahead! "); ok=1; break; 

fflush(stdout); 
} while (!ok);

}

3.配置文件


在/etc/services 中加入如下項


goodie 12345/tcp


服務名是 goodie 服務端口是 12345 服務類型是 TCP


在/etc/xinetd.d目錄下新檢服務文件 goodie


輸入內容:

 

service goodie
{
    socket_type=stream
    protocal      =tcp
    wait            =no
    server        = /{goodie dir}/goodir
    disable      =no #初始化為開啟服務監聽
}


4.啟動服務

先停止服務

killall xinetd

啟動服務

/usr/sbin/xinetd -f /etc/xinetd.conf


5.開啟終端連接

telnet localhost 12345
6.xinetd 的工作原理

通過配置xinetd,然后查看相應的套接字和進程,可以看出,

xinetd是這樣工作的(針對tcp服務) 
A.啟動時讀取/etc/xinetd.conf文件并為文件中指定的所有服務創建相應的套接字(流或數據報),xinetd能處理的服務的數目依賴于所創建的套接字數目。每個新創建的套接字都被加入到select調用所用到的描述符集中。

B.對每一個套接字調用bind,綁定服務端口(/etc/services中定義),端口號通過調用getservbyname獲得。

C.所有套接字建立后,調用select等待它們變為可讀,當tcp套接字上有數據報到來時變為可讀。xinetd在大部分時間阻塞在select的調用處;

D.xinetd守護進程fork,由子進程處理服務請求;子進程關閉除了要處理的套接字之外的所有描述字,子進程三次調用dup2,把套接字描述字復制到0、1、2,然后關閉原套接字;以后程序對套接字操作就是對0、1、2進行操作;子進程exec執行相應的服務器程序,并將配置文件中的參數傳遞。

E. 因為tcp服務器通常設置nowait標記,表示xinetd在該套接字上再次選擇之前,必須等待在該套接字上服務的子進程終止。所以,父進程中的fork返回時,把子進程的進程號記錄下來,這樣,在子進程終止時,父進程可以用waitpid的返回值查知是那一個子進程;父進程用FD_CLR宏關閉select使用的描述字集中與這個套接字對應的位,以便不對該套接字select;當子進程終止時,父進程收到一個SIGCHLD信號,父進程的信號處理程序得到終止子進程的進程號,父進程通過打開描述字集中對應的位恢復對該套接字的select。


7.重新實現的XINETD超級守護程序


A.程序利用上面的原理在思路上重新實現了超級守護進程。


B.程序在一些地方只是概念性的代碼,完全實現還有待補充。

C.程序能演示XINETD 的功能,但是在注釋有BUG 和NOTE 的地方還需改進

D.這是一個總結性的資料,參考了“利用INETD實現UDP守護進程“和“www.douzhe.com“上的文章。

 

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>

#include<netinet/in.h>
#include<sys/socket.h>

#include<string.h>
#include<sys/types.h>
#include<sys/wait.h>

#include<errno.h>
#include <sys/ioctl.h>
//為每一個服務分配一個包含socket,及路徑的信息結構。
struct param{
  int   sock;      //BIND的套接字     
  char  path[256]; //服務程序 路徑   
  pid_t  pid ;     //CHILD 進程ID    
  struct param *next;  
}

fd_set readfds;
struct param *phead,*ptail,*p;

/*
 響應子進程結束的信號函數;
 如果服務中wait=yes;
 則bind socket 必須等到子進程結束才能監聽下一個請求
*/
void signal_handler(int signum)
{
  pid_t pid;
 
  pid= waitpid(-1,NULL,WUNTRACED);
 
  for(p=phead;p!=NULL;p=p->next)
      if(p->pid==pid)
 {
          //FD_SET(p->sock,&readfds);
          printf("child exit  pid= %d/n",pid);
          break;
        }
  signal(SIGCHLD,signal_handler);
}   


int main(int argc,char *argv[])
{
  int sock,ss;
  int nret;
  int sock_len;
  struct sockaddr_in addr;  
  struct sockaddr_in addr_clt;  
  FILE *file;
  fd_set testfds;

  sock_len=sizeof(addr);
  
 
  p=(struct param*)malloc(sizeof(struct param));
  ptail=p;
  phead=NULL;


  
  p->sock=socket(AF_INET,SOCK_STREAM,0);
     //  file=fopen("/etc/xinetd.conf","r");
     //  while(1)//省略從"/etc/xinetd.conf"文件中讀每一個服務并啟動
  {
  addr.sin_family=AF_INET;
  addr.sin_addr.s_addr=htonl(INADDR_ANY); 
  addr.sin_port=htons(9734);//從“/etc/service”文件中讀服務的端口號 getservbyname;
  bind(p->sock,(struct sockaddr *)&addr,sock_len);
  listen(p->sock,5);

   FD_ZERO(&readfds);
   FD_SET(p->sock,&readfds);
   
    strcpy(p->path,"~/socket/");//省略從"/etc/xinetd.conf"文件中讀每一個服務的路徑
   if(phead==NULL)
    {
      p->next=NULL;
      phead=ptail=p;        
      printf("phead==null/n");
    }
  else
    { 
      ptail->next=p;
      ptail=p;
      ptail->next=NULL;

    }
   printf("path=%s,sock=%d/n",phead->path,phead->sock);
 }
 

  while(1)
{
  int fd;
  int clientfd;
  int n;
  pid_t pid;
  int flag=0;

  testfds=readfds;
  
   nret=select(FD_SETSIZE,&testfds,NULL,NULL,NULL);
   //if(nret<0){perror(strerror(errno));exit(5);}// bug 1:如果子進程END,會顯示“interrupt system call”錯誤。
    
   for(fd=0;fd<FD_SETSIZE;fd++)
    if(FD_ISSET(fd,&readfds))
      { //bug 2:第一次接收到串“sock addr=3.190.0.64,client sock=4”以后用LOOPBACK 連接返回為"127.0.0.1"
 clientfd=accept(fd,(struct sockaddr*)&addr_clt,&n);
        printf("sock addr=%s,client sock=%d/n",     inet_ntoa(addr_clt.sin_addr),clientfd);
         pid=fork(); 
        switch(pid)
 {
 case -1:
   perror("error");                   
   exit(5);     
        case 0: 
                    
   //dup2(clientfd,stdin);
          //dup2(clientfd,stdout);
          //dup2(clientfd,stderr); 
          //close(clientfd);
   for(p=phead;p!=NULL;p=p->next)
   if(p->sock==fd)
           { printf("child runing /n");
   //execve(); //note 1:未調用SERVER PATH(FILE)         
    }  
           sleep(1);        
    exit(5);         
        default:// >0
   close(clientfd);
   if(flag)  //note 2: 由service name 的wait 標志決定
    FD_CLR(fd,&readfds);             
           for(p=phead;p!=NULL;p=p->next)
      if(p->sock==fd)
        {    
                  p->pid=pid;
                  printf("sock:%d, child  pid=%d/n",p->sock,p->pid);
        }   
           signal(SIGCHLD,signal_handler);//note 3:放到開始,還是這兒呢?       
          break;      
 }
 
      }
  
 }

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品色午夜在线观看| 国产香蕉97碰碰久久人人| 国内揄拍国内精品少妇国语| 亚洲一区二区黄| 狠狠躁夜夜躁人人爽超碰91| 伊人久久综合97精品| 在线观看亚洲区| 久久艳片www.17c.com| 日韩在线观看电影| 91精品国产91久久久久| 亚洲老头同性xxxxx| 欧美综合国产精品久久丁香| 日韩www在线| 久久久久久久电影一区| 97视频免费在线观看| 国产在线观看精品| 日韩av电影免费观看高清| 日本一区二区在线免费播放| 欧美日在线观看| 中文字幕自拍vr一区二区三区| 精品高清美女精品国产区| 综合网中文字幕| 国产精品都在这里| 国产主播在线一区| 国产精品免费在线免费| 欧美激情欧美激情在线五月| 国产成人在线一区二区| 色伦专区97中文字幕| 欧美日韩另类字幕中文| 日本精品一区二区三区在线播放视频| 国产精品美女无圣光视频| 在线播放亚洲激情| 亚洲香蕉av在线一区二区三区| 国产成人高潮免费观看精品| 国产精品美女免费看| 上原亚衣av一区二区三区| 日韩在线观看你懂的| 亚洲国产精品电影在线观看| 久久久精品中文字幕| 日韩视频第一页| 5566成人精品视频免费| 青草青草久热精品视频在线网站| 亚洲免费精彩视频| 日韩国产高清污视频在线观看| 亚洲18私人小影院| 亚洲男人第一av网站| 久久久噜噜噜久久| 亚洲国产成人精品一区二区| 性日韩欧美在线视频| 国产精品电影网站| 久久免费观看视频| 九九九久久久久久| 国产欧美日韩精品在线观看| 欧美专区福利在线| 亚洲国产成人精品女人久久久| 久久精品91久久香蕉加勒比| 97超级碰碰碰久久久| 亚洲欧美日韩高清| 亚洲精品电影网在线观看| 国产97在线|亚洲| 中文字幕亚洲欧美日韩高清| 久久久久久国产三级电影| 欧美日韩色婷婷| 精品二区三区线观看| 最近2019年好看中文字幕视频| 久久久久久噜噜噜久久久精品| 黄色一区二区三区| 国产精品久久久久久av福利| 中文字幕国内精品| 日韩经典第一页| 久久成人18免费网站| 久久精品视频亚洲| 日韩亚洲成人av在线| 久久亚洲精品中文字幕冲田杏梨| 中文字幕欧美日韩在线| 欧美极度另类性三渗透| 91av视频在线免费观看| 91国语精品自产拍在线观看性色| 国产aⅴ夜夜欢一区二区三区| 国产a级全部精品| 欧美性猛交xxxx乱大交| 亚洲自拍欧美色图| 91美女高潮出水| 亚洲视频日韩精品| 精品人伦一区二区三区蜜桃免费| 91久久精品一区| 欧美精品在线免费播放| 一区二区av在线| 欧美黄色三级网站| 国产亚洲福利一区| 国产精品电影网站| 亚洲а∨天堂久久精品喷水| 日韩理论片久久| 久久久久女教师免费一区| 永久免费精品影视网站| 久久综合免费视频| 色婷婷亚洲mv天堂mv在影片| 91在线观看免费| 亚洲精品福利视频| 国产69精品久久久久9999| 久久国产精品首页| 国产精品久久久久99| 欧美大片欧美激情性色a∨久久| 911国产网站尤物在线观看| 国产精品主播视频| 精品激情国产视频| 亚洲最大的免费| 欧美国产在线视频| 亚洲综合中文字幕68页| 97视频在线观看成人| 欧美风情在线观看| 亚洲欧美日韩国产成人| 欧美日韩中国免费专区在线看| 亚洲美女av在线| 国产日韩欧美在线看| 日韩精品免费看| 7m精品福利视频导航| 国产精品男女猛烈高潮激情| 国产精品一区二区久久国产| 国产欧美久久一区二区| 亚洲第一页在线| 国产精品男人爽免费视频1| www.日韩不卡电影av| 91大神福利视频在线| 69视频在线播放| 国产午夜精品理论片a级探花| 欧美日韩在线影院| 精品亚洲一区二区三区四区五区| 国产91精品久久久久久久| 欧美性jizz18性欧美| 欧美日韩中文字幕在线| 国产日韩精品在线播放| 国产偷国产偷亚洲清高网站| 亚洲最大成人网色| 欧美另类精品xxxx孕妇| 一区二区在线视频| 久久久久久69| 亚洲欧美精品suv| 国产精品欧美日韩| 海角国产乱辈乱精品视频| 欧美日韩国产影院| 91热精品视频| 91成人在线观看国产| 色综合五月天导航| 久久久久久国产精品久久| 97精品视频在线观看| 国产亚洲一区精品| 久热国产精品视频| 狠狠操狠狠色综合网| 欧美亚洲伦理www| 久久资源免费视频| 亚洲片在线观看| 日韩美女毛茸茸| 欧美视频一区二区三区…| 欧美日韩爱爱视频| 久久久久久久久久婷婷| 北条麻妃久久精品| 日韩大陆毛片av| 亚洲人午夜精品免费| 欧美在线观看网站| 成人欧美一区二区三区黑人孕妇| 丝袜一区二区三区| 欧美日韩免费观看中文| 日韩久久免费视频|