想详细彻底地了解poll或看懂下面的代码请参考《Linux网络编程——I/O复用之poll函数》

代码:

 #include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/select.h>
#include <sys/time.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <poll.h>
#include <errno.h>
#define OPEN_MAX 100 int main(int argc, char *argv[])
{
//1.创建tcp监听套接字
int sockfd = socket(AF_INET, SOCK_STREAM, ); //2.绑定sockfd
struct sockaddr_in my_addr;
bzero(&my_addr, sizeof(my_addr));
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons();
my_addr.sin_addr.s_addr = htonl(INADDR_ANY);
bind(sockfd, (struct sockaddr *)&my_addr, sizeof(my_addr)); //3.监听listen
listen(sockfd, ); //4.poll相应参数准备
struct pollfd client[OPEN_MAX];
int i = , maxi = ;
for(;i<OPEN_MAX; i++)
client[i].fd = -;//初始化poll结构中的文件描述符fd client[].fd = sockfd;//需要监测的描述符
client[].events = POLLIN;//普通或优先级带数据可读 //5.对已连接的客户端的数据处理
while()
{
int ret = poll(client, maxi+, -);//对加入poll结构体数组所有元素进行监测 //5.1监测sockfd(监听套接字)是否存在连接
if((client[].revents & POLLIN) == POLLIN )
{
struct sockaddr_in cli_addr;
int clilen = sizeof(cli_addr);
int connfd = ;
//5.1.1 从tcp完成连接中提取客户端
connfd = accept(sockfd, (struct sockaddr *)&cli_addr, &clilen); //5.1.2 将提取到的connfd放入poll结构体数组中,以便于poll函数监测
for(i=; i<OPEN_MAX; i++)
{
if(client[i].fd < )
{
client[i].fd = connfd;
client[i].events = POLLIN;
break;
}
} //5.1.3 maxi更新
if(i > maxi)
maxi = i; //5.1.4 如果没有就绪的描述符,就继续poll监测,否则继续向下看
if(--ret <= )
continue;
} //5.2继续响应就绪的描述符
for(i=; i<=maxi; i++)
{
if(client[i].fd < )
continue; if(client[i].revents & (POLLIN | POLLERR))
{
int len = ;
char buf[] = ""; //5.2.1接受客户端数据
if((len = recv(client[i].fd, buf, sizeof(buf), )) < )
{
if(errno == ECONNRESET)//tcp连接超时、RST
{
close(client[i].fd);
client[i].fd = -;
}
else
perror("read error:"); }
else if(len == )//客户端关闭连接
{
close(client[i].fd);
client[i].fd = -;
}
else//正常接收到服务器的数据
send(client[i].fd, buf, len, ); //5.2.2所有的就绪描述符处理完了,就退出当前的for循环,继续poll监测
if(--ret <= )
break; }
}
}
return ;
}
运行结果:
 

Linux网络编程——tcp并发服务器(poll实现)的更多相关文章

  1. Linux 网络编程——TCP

    环境:Linux  C   一.协议介绍      TCP是面向连接的协议,提供可靠的数据传输:TCP协议的可靠传输基于三次握手.四次挥手以及确认重传机制实现.下面来具体展示下TCP的三次握手.四次挥 ...

  2. Linux网络编程-tcp缓存设置

    最近发现服务的逻辑完成时间很短,但是上游接收到的时间比较长,所以就怀疑是底层数据的序列化/反序列化.读写.传输有问题,然后怀疑是TCP的读写缓存是不是设置太小.现在就记录下TCP缓存的各配置项以及缓存 ...

  3. Linux网络编程:客户端/服务器的简单实现

    一. Socket的基本知识 1. socket功能 Socket层次 Socket实质上提供了进程通信的端点,进程通信之前,双方必须首先各自创建一个端点,否则是没有办法建立联系并相互通信的. 每一个 ...

  4. UNIX网络编程---TCP客户/服务器程序示例(五)

    一.概述 客户从标准输入读入一行文本,并写给服务器 服务器从网络输入读入这行文本,并回射给客户 客户从网络输入读入这行回射文本,并显示在标准输出上 二.TCP回射服务器程序:main函数 这里给了函数 ...

  5. Linux网络编程echo多线程服务器

    echo_server服务器多线程版本 #include <unistd.h> #include <stdlib.h> #include <stdio.h> #in ...

  6. linux网络编程echo多进程服务器

    echo_server 多进程版本 #include <unistd.h> #include <stdlib.h> #include <stdio.h> #incl ...

  7. 3.网络编程-tcp的服务器简单实现

    #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2019/1/13 22:03 # @Author : ChenAdong # @ema ...

  8. linux网络编程tcp

    之前学习的时候笔记没有保存好,这次重新编写一个案例. 客户端实现程序代码: #include <string.h> #include <stdlib.h> #include & ...

  9. Linux网络编程学习路线

    转载自:https://blog.csdn.net/lianghe_work/article 一.网络应用层编程   1.Linux网络编程01——网络协议入门 2.Linux网络编程02——无连接和 ...

随机推荐

  1. Django框架之HTTP本质

    1.Http请求本质 浏览器(socket客户端): socket.connect(ip,端口) socket.send("http://www.xiaohuar.com/index.htm ...

  2. apache2.4配置ssl

    1,yum 安装openssl和openssl-devel,httpd-devel2,生成证书(也可以从公司的证书颁发机构获取): #建立服务器密钥 openssl genrsa -des3 > ...

  3. IEnumerable的一些基本方法 补充

    接上一篇,我们发现两表连接方式默认为内连接,而我们在SQL中常用到的左连接没有封装方法.换句话说,微软放弃两表左连或右连的这种做法(只有在2个表都存在值时,这样的连接才有意义). 如果要实现表的左连接 ...

  4. springmvc注解基本入门

    简单介绍使用springmvc注解的基本流程. 1.在web.xml中配置DispatcherServlet <?xml version="1.0" encoding=&qu ...

  5. linux 查看各目录(文件夹)下文件大小

    # 显示总大小(/下全部文件占用大小) du -sh /* | sort -nr # 显示各文件夹的大小(当前文件夹下各文件夹的大小) du --max-depth=1

  6. 用js将一个数组合并到另一个数组中

    var arr1 = ["one","two","three"]; var arr2 = ["1","2&qu ...

  7. AOP理解,待细看

    http://jinnianshilongnian.iteye.com/blog/1474325

  8. review29

    数组流 流的源和目的地除了可以是文件外,还可以是计算机内存. 1.字节数组流 字节数组输入流ByteArrayInputStream和字节数组输出流ByteArrayOutputStream分别使用字 ...

  9. NAT(网络地址转换)协议

    NAT(Network Address Translator)是网络地址转换,它实现内网的IP地址与公网的地址之间的相互转换,将大量的内网IP地址转换为一个或少量的公网IP地址,减少对公网IP地址的占 ...

  10. Github 配置 SSH

    HTTPS方式管理的直接输入登录用户名和密码就可以.下面介绍SSH的方式. mac系统为例,官方ssh参考:https://help.github.com/articles/generating-ss ...