校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > Linux網絡編程使用多進程實現服務器并發訪問

Linux網絡編程使用多進程實現服務器并發訪問

熱門標簽:桂林市ai電銷機器人公司 外呼系統鏈接 新科火車站地圖標注點 磁力導航地圖標注 制作地圖標注 外呼系統怎么弄 商店地圖標注外賣入駐 地圖標注的牌子 地址高德地圖標注
采用多進程的方式實現服務器的并發訪問的經典范例。
程序實現功能:
1.客戶端從標準輸入讀入一行文字,發送到服務器.
2.服務器接收到客戶端發來的文字后,原樣返回給客戶端.
3.客戶端接收到服務器的發來的文字后,輸出到標準輸出,然后繼續以上步驟。
 服務器端過程:建立好監聽套接字后,等待客戶端的連接,接收到一個連接后,創建一個子進程來與客戶端進行通信,主進程則繼續等待其他客戶端的連接。代碼如下:
#include stdlib.h>
#include stdio.h>
#include errno.h>
#include string.h>
#include unistd.h>
#include sys/socket.h>
#include netinet/in.h>
#include sys/types.h>
#include netdb.h>
#define SERV_PORT 1113
#define LISTENQ  32
#define MAXLINE 1024
/***連接處理函數***/
void str_echo(int fd);
int
main(int argc, char *argv[]){
  int listenfd,connfd;
  pid_t childpid;
  socklen_t clilen;
  struct sockaddr_in servaddr;
  struct sockaddr_in cliaddr;
  if((listenfd = socket(AF_INET, SOCK_STREAM,0))==-1){
     fprintf(stderr,"Socket error:%s\n\a",strerror(errno));
     exit(1);
  }
  /* 服務器端填充 sockaddr結構*/
  bzero(servaddr, sizeof(servaddr));
  servaddr.sin_family = AF_INET;
  servaddr.sin_addr.s_addr = htonl (INADDR_ANY);
  servaddr.sin_port = htons(SERV_PORT);
  /* 捆綁listenfd描述符  */
  if(bind(listenfd,(struct sockaddr*)(servaddr),sizeof(struct sockaddr))==-1){
    fprintf(stderr,"Bind error:%s\n\a",strerror(errno));
    exit(1);
   }
   /* 監聽listenfd描述符*/
    if(listen(listenfd,5)==-1){
        fprintf(stderr,"Listen error:%s\n\a",strerror(errno));
        exit(1);
    }
  for ( ; ; )  {
    clilen = sizeof(cliaddr);
    /* 服務器阻塞,直到客戶程序建立連接  */
    if((connfd=accept(listenfd,(struct sockaddr*)(cliaddr),clilen))==-1){
        fprintf(stderr,"Accept error:%s\n\a",strerror(errno));
        exit(1);
    }
    //有客戶端建立了連接后
    if ( (childpid = fork()) == 0) { /*子進程*/
     close(listenfd);    /* 關閉監聽套接字*/
     str_echo(connfd);   /*處理該客戶端的請求*/
     exit (0);
    }
    close(connfd);/*父進程關閉連接套接字,繼續等待其他連接的到來*/
 }
}
void str_echo(int sockfd){
 ssize_t n;
    char  buf[MAXLINE];
    again:
      while ( (n = read(sockfd, buf, MAXLINE)) > 0)
          write(sockfd, buf, n);
      if (n 0 errno == EINTR)//被中斷,重入
          goto again;
      else if (n 0){//出錯
        fprintf(stderr,"read error:%s\n\a",strerror(errno));
        exit(1);
      }
}
客戶端過程:創建連接套接字,主動向服務器發起連接請求,建立連接后,等待標準輸入,輸入完成后,將輸入的內容發送給服務器,接著接收服務器發送過來的內容,并將接收到的內容輸出到標準輸出。代碼如下:
#include stdlib.h>
#include stdio.h>
#include errno.h>
#include string.h>
#include unistd.h>
#include sys/socket.h>
#include netinet/in.h>
#include sys/types.h>
#include netdb.h>
#define SERV_PORT 1113
#define MAXLINE 1024
void str_cli(FILE *fp, int sockfd);
int
main(int argc, char **argv)
 {
    int     sockfd;
    struct sockaddr_in servaddr;
    if (argc != 2){
        fprintf(stderr,"usage: tcpcli IPaddress>\n\a");
        exit(0);
    }
 if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1){
        fprintf(stderr,"Socket error:%s\n\a",strerror(errno));
        exit(1);
    }
   /* 客戶程序填充服務端的資料*/
      bzero(servaddr,sizeof(servaddr));
      servaddr.sin_family=AF_INET;
      servaddr.sin_port=htons(SERV_PORT);
   if (inet_pton(AF_INET, argv[1], servaddr.sin_addr) = 0){
            fprintf(stderr,"inet_pton Error:%s\a\n",strerror(errno));
            exit(1);
   }
      /* 客戶程序發起連接請求*/
      if(connect(sockfd,(struct sockaddr *)(servaddr),sizeof(struct sockaddr))==-1){
            fprintf(stderr,"connect Error:%s\a\n",strerror(errno));
            exit(1);
      }
     str_cli(stdin, sockfd);     /* do it all */
     exit(0);
 }
 void
str_cli(FILE *fp, int sockfd)
{
   int nbytes=0;
   char  sendline[MAXLINE],recvline[MAXLINE];
   while (fgets(sendline, MAXLINE, fp) != NULL){//從標準輸入中讀取一行
      write(sockfd, sendline, strlen(sendline));//將該行發送給服務器
      if ((nbytes=read(sockfd, recvline, MAXLINE)) == 0){//從sockfd讀取從服務器發來的數據
    fprintf(stderr,"str_cli: server terminated prematurely\n");
          exit(1);
   }
      recvline[nbytes]='\0';
   fputs(recvline, stdout);
   }
}
運行結果:
     1.首先啟動服務器端程序。
  viidiot@ubuntu$ ./dissrv (在后臺運行)
     2.啟動一個客戶端
         viidiot@ubuntu$ ./discli 127.0.0.1
          hello,world!(客戶端輸入的內容)
          hello,world!(服務器端返回的內容)
      3.輸入命令netstat -at查看tcp的連接情況,可以發現服務器端與客戶端已經建立起了一個連接,而服務器的主進程則仍然在1113端口監聽,等待連接其他連接的到來。
viidiot@ubuntu$ netstat –at
tcp        0      0 *:1113                  *:*                     LISTEN    
tcp        0      0 localhost.localdom:1113 localhost.localdo:57430 ESTABLISHED
tcp        0      0 localhost.localdo:57430 localhost.localdom:1113 ESTABLISHED
客戶端輸入EOF結束通信。
但是當我們開啟多個客戶端連接到服務器進行通信,完了之后通過按EOF結束通信后,可以從后臺發現一個有趣的事情,即出現了大量的僵尸進程。如下所示:
viidiot@ubuntu$ ps -a
  PID TTY          TIME CMD
19403 pts/1    00:00:00 dissrv
19405 pts/1    00:00:00 dissrv defunct>
19423 pts/1    00:00:00 dissrv defunct>
19434 pts/1    00:00:00 dissrv defunct>
19441 pts/1    00:00:00 dissrv defunct>
造成大量僵尸進程的原因是,服務器子進程終止時,會發送一個SIGCHLD信號給父進程。但我們的代碼中,并沒有捕獲該信號,而這個信號的默認動作是忽略,因此,為了避免僵尸進程的產生,我們需要捕獲SIGCHLD來清楚僵尸進程。

標簽:三門峽 湘西 茂名 慶陽 衡陽 六盤水 衡陽 仙桃

巨人網絡通訊聲明:本文標題《Linux網絡編程使用多進程實現服務器并發訪問》,本文關鍵詞  Linux,網絡編程,使用,多,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Linux網絡編程使用多進程實現服務器并發訪問》相關的同類信息!
  • 本頁收集關于Linux網絡編程使用多進程實現服務器并發訪問的相關信息資訊供網民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    国产大陆a不卡| 国产精品日韩成人| 日韩一区二区三区高清免费看看| 最新高清无码专区| 色婷婷综合久久久中文一区二区| 亚洲欧美区自拍先锋| 欧美日韩一区小说| 久久www免费人成看片高清| 久久久一区二区三区| 95精品视频在线| 亚洲高清免费在线| 2020国产精品久久精品美国| 成人免费看黄yyy456| 亚洲国产一区二区视频| 欧美成人a在线| 91网站在线播放| 奇米亚洲午夜久久精品| 中文字幕久久午夜不卡| 欧美体内she精视频| 国产在线国偷精品免费看| 中文字幕一区二| 91精品国产综合久久香蕉的特点| 国产大片一区二区| 日本91福利区| 日韩理论片在线| 欧美成人video| 欧美在线观看18| 粉嫩av一区二区三区粉嫩| 天天色图综合网| 亚洲欧洲制服丝袜| 精品国产乱码久久久久久蜜臀| hitomi一区二区三区精品| 人人爽香蕉精品| 一区二区三区四区av| 精品日韩在线观看| 欧美军同video69gay| 99久久久国产精品| 懂色av一区二区在线播放| 伦理电影国产精品| 丝袜亚洲另类欧美综合| 国产精品久久久久久久第一福利 | 日本大胆欧美人术艺术动态| 国产精品国产自产拍高清av王其| 日韩免费电影一区| 91精品国产综合久久久久久| 全国精品久久少妇| 亚洲成人动漫一区| 亚洲一级二级在线| 一区二区在线观看免费| 亚洲人成网站在线| 国产精品乱人伦| 国产三级一区二区三区| 久久久不卡网国产精品二区| 精品久久久久久久久久久院品网| 日韩视频在线一区二区| 7777精品伊人久久久大香线蕉超级流畅| 99久久精品国产精品久久 | 美女视频第一区二区三区免费观看网站 | 青青草国产成人av片免费| 一区二区高清免费观看影视大全| 一区视频在线播放| 国产女主播在线一区二区| 蜜臀av一级做a爰片久久| 日韩欧美另类在线| www.亚洲人| 中文字幕中文字幕一区二区| 色噜噜狠狠成人中文综合| 亚洲综合自拍偷拍| 欧美日韩国产一二三| 伊人一区二区三区| 亚洲人午夜精品天堂一二香蕉| 中文字幕一区二区三区不卡| 成人午夜碰碰视频| 国产综合色精品一区二区三区| 久久综合九色综合97婷婷| 国产欧美日韩在线观看| 国产精品成人免费在线| 99视频有精品| 国产乱子伦视频一区二区三区 | 国产一区三区三区| 免费日韩伦理电影| 久久成人免费网| 成人黄色777网| 在线看日本不卡| 精品欧美一区二区在线观看 | 成人精品国产免费网站| 国产精品毛片无遮挡高清| 精品福利在线导航| 中文字幕一区二区三区视频| 一区二区三区免费看视频| 日本欧美在线观看| 国产真实乱偷精品视频免| 99精品桃花视频在线观看| 欧美日韩国产影片| 欧美日韩高清一区二区| 欧美日韩亚洲综合一区二区三区| 日韩三级精品电影久久久| 国产精品女上位| 天天影视涩香欲综合网| 国产一区二区三区蝌蚪| 欧美午夜视频网站| 国产日韩欧美精品一区| 亚洲制服丝袜一区| 成人不卡免费av| 色综合中文字幕| 极品美女销魂一区二区三区免费| 国产精品乱码妇女bbbb| 日韩激情一二三区| 色88888久久久久久影院按摩| 91精品国产综合久久小美女| 国产精品灌醉下药二区| 久久99久久久久| 欧美三片在线视频观看| 亚洲欧洲日韩一区二区三区| 国产最新精品免费| 欧美日本一道本| 亚洲综合视频在线观看| 972aa.com艺术欧美| 欧美经典一区二区| 国产一区二区不卡| 日韩三级精品电影久久久| 天堂一区二区在线| 欧美一区二区三区影视| 亚洲不卡在线观看| 欧美亚洲一区二区三区四区| ㊣最新国产の精品bt伙计久久| 国产91丝袜在线播放| 久久久精品人体av艺术| 韩国一区二区在线观看| 欧美mv日韩mv国产网站app| 视频一区在线播放| 91精品国产综合久久久久久久| 天堂在线一区二区| 欧美大片在线观看| 国产米奇在线777精品观看| 欧美精品一区二区三区高清aⅴ | 亚洲第一电影网| 欧美色精品天天在线观看视频| 一区二区不卡在线视频 午夜欧美不卡在| 91在线一区二区三区| 中文字幕人成不卡一区| 91网上在线视频| 午夜久久久影院| 日韩午夜激情电影| 国产精品中文字幕欧美| 国产精品剧情在线亚洲| 日本高清视频一区二区| 亚洲影院免费观看| 欧美猛男gaygay网站| 麻豆国产精品官网| 欧美激情综合五月色丁香| 一本高清dvd不卡在线观看| 亚洲一区中文日韩| 日韩免费观看2025年上映的电影| 精品一区二区国语对白| 1000精品久久久久久久久| 欧美日韩在线精品一区二区三区激情| 日本特黄久久久高潮| 国产欧美一区二区三区鸳鸯浴| 不卡的电影网站| 免费成人在线播放| 国产精品网站在线| 欧美日韩精品二区第二页| 国产一区二区三区免费播放| 亚洲欧洲精品天堂一级| 色先锋资源久久综合| 亚洲一区二区视频| 高清在线观看日韩| 99精品视频在线免费观看| 日韩三级中文字幕| 国产在线视频一区二区| 亚洲精品一区二区三区香蕉| 国产高清精品久久久久| 1区2区3区欧美| 精品国产一区二区三区不卡 | 精品三级在线看| 91蜜桃视频在线| 国内精品伊人久久久久av一坑| 亚洲摸摸操操av| 欧美不卡在线视频| 91色九色蝌蚪| 国产毛片精品视频| 偷拍与自拍一区| 亚洲丝袜制服诱惑| 欧美精品一区二区三区在线播放| 色婷婷av一区二区三区大白胸| 国产剧情一区二区| 免费观看在线综合| 五月综合激情网| 亚洲一区在线免费观看| 国产精品美女久久久久久 | 久久激情五月婷婷| 亚洲综合色噜噜狠狠| 亚洲国产成人一区二区三区| 欧美一区二视频| 欧美电影影音先锋| 欧美亚洲愉拍一区二区| 一本色道a无线码一区v| 成人教育av在线| 国产aⅴ精品一区二区三区色成熟|