想详细彻底地了解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. Model FEP 快易播看板推播系统

    主要特色: 低成本,快速导入 透过Wi-Fi 方式推播,现场架设容易 采Web Browser 介面登入操作,简单快速 模组化版面设定,弹性调整资料呈现方式 可整合多种连线方式与外部资料库沟通 可自行 ...

  2. C++中substr的用法

    C++中substr函数的用法 #include<string> #include<iostream> using namespace std; void main() { s ...

  3. jupyter && ipython notebook简介

    2017-08-19 最近用了一下 ipython notebook 也就是 jupyter,这里有一个介绍还不错: http://www.cnblogs.com/howiewang/p/jupyte ...

  4. Spring Boot2.0之 整合XXL-Job

    参考git上面的 springboot demo 创建maven工程: pom: <project xmlns="http://maven.apache.org/POM/4.0.0&q ...

  5. HDFS-文件写入API

    package com.zhen.hdfs; import java.io.BufferedInputStream; import java.io.FileInputStream; import ja ...

  6. Java -- 利用反射 操作任意数组,包括对象数组 和 基本数据类型的数组

    items为任意数组

  7. Python之面向对象总结

    一.面向对象 1.面向过程 a.优点:极大的降低了写程序的复杂度,只需要顺着执行的步骤,堆叠代码即可 b.缺点:一套流水线或者流程就是来解决一个问题,代码就是牵一发而东莞全身 2.面向对象 a.优点: ...

  8. WP追加字符串到文件

    #if DEBUG const string logfile = "demo.log"; try { using (var sw = new System.IO.StreamWri ...

  9. 解决win10 phptoshop #fff纯白不是这样的白 显示器高级的问题

    1.打开控制面板,右上角搜索栏输入“颜色管理”, 再打开“颜色管理”.2.在“设备”选项卡里,“设备”下拉列表,选择“显示器”.3.可能你安装过显示器的驱动程序,下面的配置文件中会有一个默认的配置文件 ...

  10. CANopenSocket CANopenCGI.c hacking

    /**************************************************************************************** * CANopenS ...