程序简介:这是一个运用epoll系列函数进行IO复用的服务器模型。它是目前UNIX与LINUX平台上效率最高,最受欢迎的IO复用传输模型。

其他的不说了,直接粘贴代码吧!

服务器端:

#include "my_unp.h"  int main(void)
{    int listenfd, connfd, sockfd, epfd;  int i, maxi, nfds;  ssize_t n;    char buf[MAXLINE];    socklen_t clilen;    struct sockaddr_in cliaddr;    struct sockaddr_in servaddr;  //声明epoll_event结构体的变量,ev用于注册事件,数组用于回传要处理的事件    struct epoll_event ev, events[256];    //创建一个epoll的句柄,size用来告诉内核这个监听的数目一共有多大    epfd = Epoll_create(256);  //创建用于TCP协议的套接字      listenfd = Socket(AF_INET, SOCK_STREAM, 0);    memset(&servaddr, 0, sizeof(servaddr));    servaddr.sin_family = AF_INET;    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);    servaddr.sin_port = htons(SERV_PORT);    //把socket和socket地址结构联系起来    Bind(listenfd, (SA*)&servaddr, sizeof(servaddr));  //开始监听LISTENQ端口    Listen(listenfd, LISTENQ);  //设置与要处理的事件相关的文件描述符和事件  ev.data.fd = listenfd;    ev.events = EPOLLIN|EPOLLET;    //注册epoll事件    Epoll_ctl(epfd, EPOLL_CTL_ADD, listenfd,&ev);    maxi = 0;  while(1)  {    //等待epoll事件的发生    //返回需要处理的事件数目nfds,如返回0表示已超时。    nfds = Epoll_wait(epfd, events, 20, 500);    //处理所发生的所有事件    for(i=0; i < nfds; ++i)    {    //如果新监测到一个SOCKET用户连接到了绑定的SOCKET端口,建立新的连接。    if(events[i].data.fd == listenfd)    {    connfd = Accept(listenfd,(SA*)&cliaddr, &clilen);    printf("connection from %s, port %d.\n",        Inet_ntop(AF_INET, (void*)&cliaddr.sin_addr, buf, sizeof(buf)),        ntohs(cliaddr.sin_port));    //设置用于读操作的文件描述符和事件  ev.data.fd = connfd;    ev.events = EPOLLIN|EPOLLET;    //注册事件  Epoll_ctl(epfd,EPOLL_CTL_ADD,connfd,&ev);  }    //如果是已经连接的用户,并且收到数据,那么进行读入。    else if(events[i].events & EPOLLIN)    {    sockfd = events[i].data.fd;  if ( sockfd < 0 )    continue;    n = read(sockfd, buf, MAXLINE);  if ( n < 0)    {      // Connection Reset:你连接的那一端已经断开了,  //而你却还试着在对方已断开的socketfd上读写数据!    if (errno == ECONNRESET)    {    Close(sockfd);    events[i].data.fd = -1;    }    else    error_quit("read error");  }    //如果读入的数据为空    else if ( n == 0 )  {    Close(sockfd);    events[i].data.fd = -1;    }    else  {  //设置用于写操作的文件描述符和事件  ev.data.fd = sockfd;  ev.events = EPOLLOUT|EPOLLET;  //注册事件  Epoll_ctl(epfd,EPOLL_CTL_MOD,sockfd,&ev);  }  }  //如果有数据发送  else if(events[i].events & EPOLLOUT)  {  sockfd = events[i].data.fd;  Writen(sockfd, buf, n);    //设置用于读操作的文件描述符和事件  ev.data.fd = sockfd;  ev.events = EPOLLIN|EPOLLET;  //注册事件  Epoll_ctl(epfd, EPOLL_CTL_MOD, sockfd, &ev);  }  }  }  return 0;
} 

客户端的测试例子:

#include "my_unp.h"

void str_cli(FILE *fp, int sockfd)  
{  
 char sendline[MAXLINE], recvline[MAXLINE];  
 int len;

//从终端获取一行字符串,将其写入套接字  
 //然后从套接字一行字符串,将其写入终端  
 while( Fgets(sendline, MAXLINE, fp) != NULL )  
 {  
  Writen(sockfd, sendline, strlen(sendline));  
  len = Read(sockfd, recvline, MAXLINE);
  if( len == 0 )  
   error_quit("str_cli: server terminated prematurely");  
  recvline[len] = 0;
  Fputs(recvline, stdout);  
 }  
}

int main(int argc, char **argv)  
{  
 int sockfd;  
 struct sockaddr_in servaddr;  
 if( argc != 2 )  
  error_quit("usage: client <IPAddress>");

//创建用于TCP协议的套接字  
 sockfd = Socket(AF_INET, SOCK_STREAM, 0);  
 memset(&servaddr, 0, sizeof(servaddr));  
 servaddr.sin_family = AF_INET;  
 servaddr.sin_port = htons(SERV_PORT);

//将程序的参数1(argv[1])转换成套接字地址结构  
 Inet_pton(AF_INET, argv[1], &servaddr.sin_addr);  
 向服务器发起连接,连接成功后client_socket代表了客户机和服务器的一个socket连接  
 Connect(sockfd, (SA*)&servaddr, sizeof(servaddr));

str_cli(stdin, sockfd);  
 return 0;  
}

运行示例(红色字体的为输入)(假设某个回射字符串的服务器已经启动)

www.linuxidc.com@ubuntu:~/code$ gcc my_unp_v1.c client.c -o client
www.linuxidc.com@ubuntu:~/code$ ./client 127.0.0.1
ABCD
ABCD
Ctrl+D

UNIX TCP回射服务器/客户端之使用epoll模型的服务器相关推荐

  1. LIBUV学习笔记(三)libuv中pipe/tty相关操作以及一个简单的unix域回射服务器/客户端例子...

    uv_pipe_t - Pipe handle Pipe handles provide an abstraction over local domain sockets on Unix and na ...

  2. python 使用tcp协议实现web服务器(七) epoll版本web服务器

    文章目录 摘要 前置知识 运行截图 html,css文件代码 index.html login.html register.html style.css python代码 摘要 使用python 基于 ...

  3. 手机wifi显示未连接服务器,客户端显示wifi未连接到服务器

    客户端显示wifi未连接到服务器 内容精选 换一换 保证源端与目的端网络连通,以及华为云上目的端服务器的安全组规则允许Iperf测试端口开放.配置安全组规则的具体方法请参见如何配置目的端服务器安全组规 ...

  4. excel服务器客户端在哪个文件夹,excel服务器客户端安装配置

    excel服务器客户端安装配置 内容精选 换一换 安装配置Agent成功,需要等待2分钟,控制台上才会有主机监控数据.如果过了5min在总览页面还未看到"裸金属服务器",则需要排查 ...

  5. epoll模型之服务器设计

    Linux  2.6内核中提高网络I/O性能的新方法-epoll I/O多路复用技术在比较多的TCP网络服务器中有使用,即比较多的用到select函数. 1.为什么select落后     首先,在L ...

  6. UNIX网络编程——使用线程的TCP回射服务器程序

    同一进程内的所有线程除了共享全局变量外还共享: (1)进程指令: (2)大多数数据: (3)  打开的文件(即描述符): (4)信号处理函数和信号处置: (5)当前工作目录: (6)用户ID和组ID. ...

  7. 网络编程学习笔记(TCP回射服务器程序修订版)

    服务器端: #include <sys/socket.h> #include <stdio.h> #include <netinet/in.h> #include ...

  8. UNIX网络编程卷1 回射客户程序 TCP客户程序设计范式

    本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie 下面我会介绍同一个使用 TCP 协议的客户端程序的几个不同版本,分别是停等版本.select ...

  9. UNIX网络编程笔记(4):简单的回射程序

    上一讲中我们通过调用fork函数实现了一个简单的并发时间获取服务器.这是一个简单的并发服务器框架,然而这里使用这个框架实现一个简单的回射服务器会出现一个问题,这个问题就是僵尸子进程. 1.回射程序 下 ...

最新文章

  1. zabbix 乱码的问题
  2. 广东安网2016:重拳挥出 打造安宁互联网环境
  3. 把权限控制做成用户控件--简易型
  4. 趣学python编程第六章答案_Python核心编程-第六章-习题
  5. 二叉树前序遍历python输出_Python 二叉树查找 前序 中序 后序遍历
  6. Exception in thread “Quartz Scheduler [HmpScheduler]“ org.springframework.scheduling.SchedulingExcep
  7. linux 4.1.16 ftrace 进程调度,Linux内核进程调度overview(1)
  8. cvpr 深度估计_CVPR再现黑科技!你还在相信“眼见为实”?
  9. python dll文件丢失_python34.dll
  10. reflect动画_3DSMAX制作超时空未来动画场景-3D建模场景模型教程
  11. 吴恩达深度学习2.3练习_Improving Deep Neural Networks_Tensorflow
  12. 远程连接SQL Server (转)
  13. 重新加载maven项目的依赖项
  14. JS_综合,全面性增删改查,多条件查询,排序,点击发货
  15. 知名互联网公司校招 Java 开发岗面试知识点解析
  16. in作为介词的用法_介词in重要用法归纳
  17. 诡异的The inferior stopped because it triggered an exception错误
  18. JavaScript面向对象实现-坦克大战(附前端全套学习路线)
  19. 10. kafka消费者如何分配分区
  20. RDKit 操作分子对象

热门文章

  1. 简单解释什么是 依赖注入 和 控制反转
  2. 修改 cmd 字体为 Consolas
  3. 快速地创建快顶尖的医学图像处理控件ImageGear Medical
  4. 摈弃 Windows 低效率的工作方式,发掘 Linux 身上的 UNIX 气质
  5. java注解:@Deprecated(不建议使用的,废弃的);@SuppressWarnings(忽略警告,达到抑制编译器产生警告的目的)
  6. 函数重载与运算符重载
  7. du -sh 如何找到最大的文件夹_小白必看!手把手教你如何在linux上安装redis数据库...
  8. python对excel表统计视频教程_Python实现对excel文件列表值进行统计的方法
  9. 【深度学习】TensorFlow之卷积神经网络
  10. mysql 即学a又学b_MySQL学习第一天