UNIX TCP回射服务器/客户端之使用epoll模型的服务器
程序简介:这是一个运用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模型的服务器相关推荐
- LIBUV学习笔记(三)libuv中pipe/tty相关操作以及一个简单的unix域回射服务器/客户端例子...
uv_pipe_t - Pipe handle Pipe handles provide an abstraction over local domain sockets on Unix and na ...
- python 使用tcp协议实现web服务器(七) epoll版本web服务器
文章目录 摘要 前置知识 运行截图 html,css文件代码 index.html login.html register.html style.css python代码 摘要 使用python 基于 ...
- 手机wifi显示未连接服务器,客户端显示wifi未连接到服务器
客户端显示wifi未连接到服务器 内容精选 换一换 保证源端与目的端网络连通,以及华为云上目的端服务器的安全组规则允许Iperf测试端口开放.配置安全组规则的具体方法请参见如何配置目的端服务器安全组规 ...
- excel服务器客户端在哪个文件夹,excel服务器客户端安装配置
excel服务器客户端安装配置 内容精选 换一换 安装配置Agent成功,需要等待2分钟,控制台上才会有主机监控数据.如果过了5min在总览页面还未看到"裸金属服务器",则需要排查 ...
- epoll模型之服务器设计
Linux 2.6内核中提高网络I/O性能的新方法-epoll I/O多路复用技术在比较多的TCP网络服务器中有使用,即比较多的用到select函数. 1.为什么select落后 首先,在L ...
- UNIX网络编程——使用线程的TCP回射服务器程序
同一进程内的所有线程除了共享全局变量外还共享: (1)进程指令: (2)大多数数据: (3) 打开的文件(即描述符): (4)信号处理函数和信号处置: (5)当前工作目录: (6)用户ID和组ID. ...
- 网络编程学习笔记(TCP回射服务器程序修订版)
服务器端: #include <sys/socket.h> #include <stdio.h> #include <netinet/in.h> #include ...
- UNIX网络编程卷1 回射客户程序 TCP客户程序设计范式
本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie 下面我会介绍同一个使用 TCP 协议的客户端程序的几个不同版本,分别是停等版本.select ...
- UNIX网络编程笔记(4):简单的回射程序
上一讲中我们通过调用fork函数实现了一个简单的并发时间获取服务器.这是一个简单的并发服务器框架,然而这里使用这个框架实现一个简单的回射服务器会出现一个问题,这个问题就是僵尸子进程. 1.回射程序 下 ...
最新文章
- zabbix 乱码的问题
- 广东安网2016:重拳挥出 打造安宁互联网环境
- 把权限控制做成用户控件--简易型
- 趣学python编程第六章答案_Python核心编程-第六章-习题
- 二叉树前序遍历python输出_Python 二叉树查找 前序 中序 后序遍历
- Exception in thread “Quartz Scheduler [HmpScheduler]“ org.springframework.scheduling.SchedulingExcep
- linux 4.1.16 ftrace 进程调度,Linux内核进程调度overview(1)
- cvpr 深度估计_CVPR再现黑科技!你还在相信“眼见为实”?
- python dll文件丢失_python34.dll
- reflect动画_3DSMAX制作超时空未来动画场景-3D建模场景模型教程
- 吴恩达深度学习2.3练习_Improving Deep Neural Networks_Tensorflow
- 远程连接SQL Server (转)
- 重新加载maven项目的依赖项
- JS_综合,全面性增删改查,多条件查询,排序,点击发货
- 知名互联网公司校招 Java 开发岗面试知识点解析
- in作为介词的用法_介词in重要用法归纳
- 诡异的The inferior stopped because it triggered an exception错误
- JavaScript面向对象实现-坦克大战(附前端全套学习路线)
- 10. kafka消费者如何分配分区
- RDKit 操作分子对象
热门文章
- 简单解释什么是 依赖注入 和 控制反转
- 修改 cmd 字体为 Consolas
- 快速地创建快顶尖的医学图像处理控件ImageGear Medical
- 摈弃 Windows 低效率的工作方式,发掘 Linux 身上的 UNIX 气质
- java注解:@Deprecated(不建议使用的,废弃的);@SuppressWarnings(忽略警告,达到抑制编译器产生警告的目的)
- 函数重载与运算符重载
- du -sh 如何找到最大的文件夹_小白必看!手把手教你如何在linux上安装redis数据库...
- python对excel表统计视频教程_Python实现对excel文件列表值进行统计的方法
- 【深度学习】TensorFlow之卷积神经网络
- mysql 即学a又学b_MySQL学习第一天