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

主頁 > 知識庫 > Linux IO多路復用之epoll網絡編程

Linux IO多路復用之epoll網絡編程

熱門標簽:安陽ai電銷機器人軟件 外呼系統的經營范圍 申請400電話價格多少 云會外呼系統 智能電話機器人坐席 涪陵商都400電話開通辦理 廈門營銷外呼系統平臺 柳州市機器人外呼系統報價 外呼系統不彈窗

前言

本章節是用基本的Linux基本函數加上epoll調用編寫一個完整的服務器和客戶端例子,可在Linux上運行,客戶端和服務端的功能如下:

  • 客戶端從標準輸入讀入一行,發送到服務端
  • 服務端從網絡讀取一行,然后輸出到客戶端
  • 客戶端收到服務端的響應,輸出這一行到標準輸出

服務端

代碼如下:

#include <unistd.h>
#include <sys/types.h>    /* basic system data types */
#include <sys/socket.h>   /* basic socket definitions */
#include <netinet/in.h>   /* sockaddr_in{} and other Internet defns */
#include <arpa/inet.h>    /* inet(3) functions */
#include <sys/epoll.h> /* epoll function */
#include <fcntl.h>   /* nonblocking */
#include <sys/resource.h> /*setrlimit */
#include <stdlib.h>
#include <errno.h>
#include <stdio.h>
#include <string.h>
#define MAXEPOLLSIZE 10000
#define MAXLINE 10240
int handle(int connfd);
int setnonblocking(int sockfd)
{
  if (fcntl(sockfd, F_SETFL, fcntl(sockfd, F_GETFD, 0)|O_NONBLOCK) == -1) {
    return -1;
  }
  return 0;
}
int main(int argc, char **argv)
{
  int servPort = 6888;
  int listenq = 1024;
  int listenfd, connfd, kdpfd, nfds, n, nread, curfds,acceptCount = 0;
  struct sockaddr_in servaddr, cliaddr;
  socklen_t socklen = sizeof(struct sockaddr_in);
  struct epoll_event ev;
  struct epoll_event events[MAXEPOLLSIZE];
  struct rlimit rt;
  char buf[MAXLINE];
  /* 設置每個進程允許打開的最大文件數 */
  rt.rlim_max = rt.rlim_cur = MAXEPOLLSIZE;
  if (setrlimit(RLIMIT_NOFILE, &rt) == -1) 
  {
    perror("setrlimit error");
    return -1;
  }
  bzero(&servaddr, sizeof(servaddr));
  servaddr.sin_family = AF_INET; 
  servaddr.sin_addr.s_addr = htonl (INADDR_ANY);
  servaddr.sin_port = htons (servPort);
  listenfd = socket(AF_INET, SOCK_STREAM, 0); 
  if (listenfd == -1) {
    perror("can't create socket file");
    return -1;
  }
  int opt = 1;
  setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
  if (setnonblocking(listenfd) < 0) {
    perror("setnonblock error");
  }
  if (bind(listenfd, (struct sockaddr *) &servaddr, sizeof(struct sockaddr)) == -1) 
  {
    perror("bind error");
    return -1;
  } 
  if (listen(listenfd, listenq) == -1) 
  {
    perror("listen error");
    return -1;
  }
  /* 創建 epoll 句柄,把監聽 socket 加入到 epoll 集合里 */
  kdpfd = epoll_create(MAXEPOLLSIZE);
  ev.events = EPOLLIN | EPOLLET;
  ev.data.fd = listenfd;
  if (epoll_ctl(kdpfd, EPOLL_CTL_ADD, listenfd, &ev) < 0) 
  {
    fprintf(stderr, "epoll set insertion error: fd=%d\n", listenfd);
    return -1;
  }
  curfds = 1;
  printf("epollserver startup,port %d, max connection is %d, backlog is %d\n", servPort, MAXEPOLLSIZE, listenq);
  for (;;) {
    /* 等待有事件發生 */
    nfds = epoll_wait(kdpfd, events, curfds, -1);
    if (nfds == -1)
    {
      perror("epoll_wait");
      continue;
    }
    /* 處理所有事件 */
    for (n = 0; n < nfds; ++n)
    {
      if (events[n].data.fd == listenfd) 
      {
        connfd = accept(listenfd, (struct sockaddr *)&cliaddr,&socklen);
        if (connfd < 0) 
        {
          perror("accept error");
          continue;
        }
        sprintf(buf, "accept form %s:%d\n", inet_ntoa(cliaddr.sin_addr), cliaddr.sin_port);
        printf("%d:%s", ++acceptCount, buf);

        if (curfds >= MAXEPOLLSIZE) {
          fprintf(stderr, "too many connection, more than %d\n", MAXEPOLLSIZE);
          close(connfd);
          continue;
        } 
        if (setnonblocking(connfd) < 0) {
          perror("setnonblocking error");
        }
        ev.events = EPOLLIN | EPOLLET;
        ev.data.fd = connfd;
        if (epoll_ctl(kdpfd, EPOLL_CTL_ADD, connfd, &ev) < 0)
        {
          fprintf(stderr, "add socket '%d' to epoll failed: %s\n", connfd, strerror(errno));
          return -1;
        }
        curfds++;
        continue;
      } 
      // 處理客戶端請求
      if (handle(events[n].data.fd) < 0) {
        epoll_ctl(kdpfd, EPOLL_CTL_DEL, events[n].data.fd,&ev);
        curfds--;
      }
    }
  }
  close(listenfd);
  return 0;
}
int handle(int connfd) {
  int nread;
  char buf[MAXLINE];
  nread = read(connfd, buf, MAXLINE);//讀取客戶端socket流
  if (nread == 0) {
    printf("client close the connection\n");
    close(connfd);
    return -1;
  } 
  if (nread < 0) {
    perror("read error");
    close(connfd);
    return -1;
  }  
  write(connfd, buf, nread);//響應客戶端 
  return 0;
}

編譯

編譯和啟動服務端

gcc epollserver.c -o epollserver
./epollserver

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。如果你想了解更多相關內容請查看下面相關鏈接

標簽:晉城 福州 綏化 撫順 巴中 孝感 蕪湖 南充

巨人網絡通訊聲明:本文標題《Linux IO多路復用之epoll網絡編程》,本文關鍵詞  Linux,多路,復,用之,epoll,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Linux IO多路復用之epoll網絡編程》相關的同類信息!
  • 本頁收集關于Linux IO多路復用之epoll網絡編程的相關信息資訊供網民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    国产精品免费视频网站| 精品剧情v国产在线观看在线| 看电视剧不卡顿的网站| 午夜av一区二区三区| 亚洲午夜日本在线观看| 亚洲黄色小视频| 亚洲午夜激情av| 日本亚洲视频在线| 蜜臀精品久久久久久蜜臀| 久久www免费人成看片高清| 麻豆精品一区二区综合av| 极品尤物av久久免费看| 国产夫妻精品视频| 99久久er热在这里只有精品15| 91蜜桃免费观看视频| 欧美日韩亚洲高清一区二区| 69精品人人人人| 国产亚洲欧美日韩日本| 国产精品久久久久久久久免费相片 | 久久精品亚洲乱码伦伦中文| 精品国产乱码久久久久久牛牛| 欧美精品一区二区在线播放| 国产欧美精品国产国产专区| 亚洲图片激情小说| 午夜久久久影院| 国产成人高清在线| 欧美专区在线观看一区| 日韩免费观看2025年上映的电影| 久久久久久久综合| 亚洲精品免费电影| 免费国产亚洲视频| 91色.com| 精品粉嫩超白一线天av| 亚洲日本va在线观看| 日日欢夜夜爽一区| 国产99久久久精品| 精品视频123区在线观看| 久久人人爽爽爽人久久久| 亚洲欧美一区二区三区孕妇| 美国欧美日韩国产在线播放| 色一情一乱一乱一91av| 日韩欧美123| 一个色在线综合| 粉嫩久久99精品久久久久久夜| 欧美亚洲尤物久久| 国产精品美女www爽爽爽| 日韩精品视频网站| 91原创在线视频| 久久久777精品电影网影网| 午夜精彩视频在线观看不卡| 成人黄色一级视频| 久久精品在这里| 美日韩一区二区三区| 欧美影院午夜播放| 亚洲欧美一区二区三区孕妇| 国产一区日韩二区欧美三区| 欧美剧情片在线观看| 综合婷婷亚洲小说| 懂色av一区二区三区免费看| 精品国产乱码久久久久久久久| 亚洲一区二区视频在线观看| av日韩在线网站| 国产日产亚洲精品系列| 久久er99热精品一区二区| 欧美挠脚心视频网站| 亚洲一区二区影院| 在线观看91视频| 一区二区三区在线免费播放| 99热这里都是精品| 国产精品电影一区二区三区| 国产成人在线观看免费网站| 精品国产髙清在线看国产毛片 | 日韩av电影免费观看高清完整版在线观看| 国产精品羞羞答答xxdd | 国产aⅴ精品一区二区三区色成熟| 91精品欧美综合在线观看最新| 亚洲一二三区在线观看| 在线一区二区三区四区| 一区二区三区电影在线播| 99re热视频精品| 亚洲欧美另类综合偷拍| 欧美在线观看视频在线| 午夜久久福利影院| 精品久久五月天| 国产精品99久久不卡二区| 国产女人水真多18毛片18精品视频| 国产呦精品一区二区三区网站| 久久免费电影网| 99久久亚洲一区二区三区青草| 最好看的中文字幕久久| 欧美日韩三级一区| 久久99精品国产麻豆婷婷| 久久久久亚洲蜜桃| 91一区二区在线观看| 一区二区在线观看av| 欧美亚一区二区| 老司机精品视频一区二区三区| 精品99一区二区| 99精品久久99久久久久| 亚洲亚洲精品在线观看| 久久综合一区二区| 99久免费精品视频在线观看 | 欧美va日韩va| 成人午夜在线视频| 亚洲成a人在线观看| 精品国产成人系列| 91久久精品网| 国内精品伊人久久久久av影院| 国产欧美视频一区二区三区| 在线观看欧美精品| 九九视频精品免费| 亚洲一区二区三区四区中文字幕| 欧美一区二区三区精品| 成人毛片视频在线观看| 丝袜诱惑制服诱惑色一区在线观看 | 欧美一区二区三区在线观看| 国产精品资源在线| 亚洲成人免费电影| 国产精品无码永久免费888| 在线成人免费视频| 成人在线视频一区| 美女视频黄久久| 亚洲一级二级三级| 国产精品理论在线观看| 精品美女在线播放| 欧美性大战久久久久久久蜜臀| 国产老妇另类xxxxx| 日本一区中文字幕| 亚洲午夜一区二区三区| 亚洲婷婷在线视频| 国产午夜精品一区二区三区视频 | 久久久久久免费| 91精品国产欧美一区二区成人| caoporn国产一区二区| 韩国一区二区三区| 奇米影视在线99精品| 日韩午夜小视频| 在线综合亚洲欧美在线视频| 色综合久久久久综合体| 成人免费看的视频| 国产suv精品一区二区6| 老色鬼精品视频在线观看播放| 午夜电影网亚洲视频| 亚洲一区二区三区在线| 亚洲黄色片在线观看| 最新久久zyz资源站| 国产精品毛片久久久久久久| 国产欧美日韩精品a在线观看| 精品久久国产老人久久综合| 欧美成人精品福利| 欧美成人一级视频| 欧美成人高清电影在线| 欧美一二三区在线观看| 884aa四虎影成人精品一区| 欧美精品在线观看播放| 欧美日韩国产另类一区| 欧美日韩1区2区| 欧美电影一区二区三区| 日韩精品中文字幕一区二区三区| 欧美在线制服丝袜| 欧美老女人第四色| 欧美一区在线视频| 久久综合狠狠综合| 国产亚洲欧美在线| 日韩美女久久久| 伊人夜夜躁av伊人久久| 一区二区免费看| 日日骚欧美日韩| 国产一区免费电影| 99久久国产免费看| 欧美视频在线一区| 日韩一级二级三级| 国产欧美一区视频| 亚洲女子a中天字幕| 亚洲曰韩产成在线| 久久99国产精品免费| 日本高清免费不卡视频| 日韩午夜激情免费电影| 日韩欧美国产三级| 中文字幕亚洲不卡| 午夜伊人狠狠久久| 精品在线你懂的| 色诱视频网站一区| 欧美一区二区网站| 中文字幕视频一区二区三区久| 亚洲一区二区三区免费视频| 欧美a级一区二区| 国产成人在线免费| 在线播放日韩导航| 国产色综合一区| 日韩高清欧美激情| 成人少妇影院yyyy| 91精品国产综合久久国产大片| 久久蜜桃av一区二区天堂| 亚洲综合自拍偷拍| 国产高清在线精品| 欧美一区二区三区白人| 最新高清无码专区| 国产尤物一区二区| 欧美日韩国产一二三|