婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 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網絡編程的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    国产成人亚洲精品狼色在线| 国产精品自拍三区| 丁香六月综合激情| 久久精品欧美一区二区三区不卡| 久久国产精品99久久人人澡| 精品国产一区二区国模嫣然| 亚洲女厕所小便bbb| 日本乱人伦aⅴ精品| 日韩精品色哟哟| 国产丝袜在线精品| 色呦呦国产精品| 日韩精品一级中文字幕精品视频免费观看 | 欧美中文字幕一区二区三区 | 欧美性淫爽ww久久久久无| 麻豆精品一区二区av白丝在线| 久久综合久久99| 99re热视频精品| 午夜激情综合网| 国产精品日韩精品欧美在线| 69成人精品免费视频| 天涯成人国产亚洲精品一区av| 蜜桃视频免费观看一区| 色婷婷综合久久| 国产成人精品在线看| 日韩专区中文字幕一区二区| 一区二区三区免费在线观看| www欧美成人18+| 欧美久久久影院| 欧美性猛交xxxx乱大交退制版| 国产精品18久久久久久久久| 亚洲精品高清视频在线观看| 国产欧美日韩亚州综合 | 日韩精品91亚洲二区在线观看| 久久久精品欧美丰满| 91精品欧美综合在线观看最新| 成人教育av在线| 国产精品91xxx| 美女视频第一区二区三区免费观看网站| 亚洲免费观看在线观看| 亚洲男人的天堂在线观看| 蜜臀av在线播放一区二区三区| 综合色中文字幕| 国产精品免费看片| 国产精品白丝在线| 国产婷婷色一区二区三区四区| 久久午夜羞羞影院免费观看| 久久久99久久| 国产精品每日更新在线播放网址| 国产欧美一区二区三区沐欲| 欧美精品一区二区三区在线播放 | 日本不卡免费在线视频| 午夜精品福利一区二区蜜股av | 欧美一二三区在线观看| 91精品国产品国语在线不卡| 欧美一级欧美一级在线播放| 日韩一卡二卡三卡国产欧美| 欧美成人一区二区三区| 国产精品美女久久久久久久网站| 一区二区三区在线播| 日本系列欧美系列| 成人av电影观看| 欧美日韩国产a| 精品国产不卡一区二区三区| 亚洲色图在线视频| 精品一区二区三区不卡 | 国产一区免费电影| 91丨九色丨蝌蚪丨老版| 日韩一区二区三区三四区视频在线观看 | 国产日产亚洲精品系列| 亚洲成人激情综合网| 成人免费高清在线| 欧美一区二区三区在| 成人欧美一区二区三区小说| 日本欧美一区二区三区| 91亚洲午夜精品久久久久久| 久久久影院官网| 日日夜夜免费精品| 日产欧产美韩系列久久99| 欧美mv日韩mv| 久久久综合网站| 亚洲一区二区三区四区不卡| 国产成人av电影| 日韩精品一区二区三区在线播放 | 风间由美中文字幕在线看视频国产欧美| 欧美影院精品一区| 亚洲人成影院在线观看| 国产成人午夜视频| 欧美变态口味重另类| 奇米色777欧美一区二区| 欧美图区在线视频| 一区二区三区在线影院| 99热国产精品| 中文字幕一区在线观看视频| 成人自拍视频在线观看| 国产日韩欧美精品综合| 激情综合色播五月| 精品欧美一区二区三区精品久久| 青草国产精品久久久久久| 欧美一区二区精品| 久久er精品视频| 久久色在线视频| 风间由美一区二区三区在线观看 | 久久久91精品国产一区二区三区| 免费欧美高清视频| 日韩一级大片在线观看| 狠狠色狠狠色综合| 久久久久国产一区二区三区四区 | 专区另类欧美日韩| 欧美在线观看禁18| 视频一区二区三区中文字幕| 欧美一级片在线看| 成av人片一区二区| 又紧又大又爽精品一区二区| 欧美一区二区免费观在线| 国产在线不卡一区| 亚洲福利一区二区| 久久久久久久av麻豆果冻| av中文一区二区三区| 亚洲福利视频导航| 国产丝袜在线精品| 欧美精品三级在线观看| 成人动漫一区二区在线| 日韩电影一二三区| 中文在线一区二区| 日韩欧美国产综合| 欧美在线一区二区三区| 国产精品一二三| 男男视频亚洲欧美| 亚洲午夜久久久久久久久久久| 亚洲精品一区二区三区精华液 | 久久成人免费电影| 亚洲另类色综合网站| 国产三级三级三级精品8ⅰ区| 777a∨成人精品桃花网| 91麻豆免费观看| 国产91露脸合集magnet| 国产精品一区免费视频| 免费观看在线综合| 亚洲一区在线观看视频| 亚洲日本在线观看| 中文字幕一区日韩精品欧美| 国产午夜亚洲精品午夜鲁丝片| 日韩美女天天操| 91久久精品日日躁夜夜躁欧美| 亚洲欧洲日本在线| 在线亚洲欧美专区二区| 99久久精品国产观看| 成人午夜av电影| 91亚洲男人天堂| 色综合久久天天| 欧洲视频一区二区| 欧美亚洲尤物久久| 91精品国产综合久久香蕉的特点| 欧美军同video69gay| 日韩欧美一级二级三级| 欧美大片一区二区| 久久久噜噜噜久久中文字幕色伊伊| 精品国产一区二区三区不卡| 欧美本精品男人aⅴ天堂| 欧美精品一区二| 国产精品久久久久一区二区三区 | 91视频在线观看| 色综合久久综合| 91精品国产综合久久小美女| 日韩午夜中文字幕| 国产欧美一二三区| 一区av在线播放| 蜜桃av一区二区在线观看| 激情综合色播五月| 99国产精品久久久久| 91国偷自产一区二区开放时间| 欧美精品久久一区| 日本一区二区综合亚洲| 亚洲精品国产视频| 免费高清成人在线| 99在线热播精品免费| 欧美一区二区三区在| 国产精品美女久久久久久2018| 亚洲综合久久久久| 狠狠狠色丁香婷婷综合激情| 91麻豆免费看| 国产三级一区二区三区| 图片区小说区区亚洲影院| 高清国产一区二区| 欧美大片顶级少妇| 丝袜亚洲另类欧美| 成人免费高清视频在线观看| 欧美精品高清视频| 一区二区三区**美女毛片| 国产91在线|亚洲| 欧美tickle裸体挠脚心vk| 国产精品每日更新在线播放网址| 久久国产剧场电影| 日韩欧美在线影院| 亚洲午夜久久久久久久久电影院| 懂色av中文一区二区三区| 欧美精品一区二区久久久| 香蕉av福利精品导航| 在线观看日韩电影| 亚洲综合图片区|