Linux网络编程——tcp并发服务器(poll实现)
想详细彻底地了解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实现)的更多相关文章
- Linux 网络编程——TCP
环境:Linux C 一.协议介绍 TCP是面向连接的协议,提供可靠的数据传输:TCP协议的可靠传输基于三次握手.四次挥手以及确认重传机制实现.下面来具体展示下TCP的三次握手.四次挥 ...
- Linux网络编程-tcp缓存设置
最近发现服务的逻辑完成时间很短,但是上游接收到的时间比较长,所以就怀疑是底层数据的序列化/反序列化.读写.传输有问题,然后怀疑是TCP的读写缓存是不是设置太小.现在就记录下TCP缓存的各配置项以及缓存 ...
- Linux网络编程:客户端/服务器的简单实现
一. Socket的基本知识 1. socket功能 Socket层次 Socket实质上提供了进程通信的端点,进程通信之前,双方必须首先各自创建一个端点,否则是没有办法建立联系并相互通信的. 每一个 ...
- UNIX网络编程---TCP客户/服务器程序示例(五)
一.概述 客户从标准输入读入一行文本,并写给服务器 服务器从网络输入读入这行文本,并回射给客户 客户从网络输入读入这行回射文本,并显示在标准输出上 二.TCP回射服务器程序:main函数 这里给了函数 ...
- Linux网络编程echo多线程服务器
echo_server服务器多线程版本 #include <unistd.h> #include <stdlib.h> #include <stdio.h> #in ...
- linux网络编程echo多进程服务器
echo_server 多进程版本 #include <unistd.h> #include <stdlib.h> #include <stdio.h> #incl ...
- 3.网络编程-tcp的服务器简单实现
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2019/1/13 22:03 # @Author : ChenAdong # @ema ...
- linux网络编程tcp
之前学习的时候笔记没有保存好,这次重新编写一个案例. 客户端实现程序代码: #include <string.h> #include <stdlib.h> #include & ...
- Linux网络编程学习路线
转载自:https://blog.csdn.net/lianghe_work/article 一.网络应用层编程 1.Linux网络编程01——网络协议入门 2.Linux网络编程02——无连接和 ...
随机推荐
- SQL单行函数和多行函数
单行函数和多行函数示意图: 单行函数分为五种类型:字符函数.数值函数.日期函数.转换函数.通用函数 单行函数: --大小写控制函数 select lower('Hello World') 转小写, u ...
- Guidelines for Successful SoC Verification in OVM/UVM
By Moataz El-Metwally, Mentor Graphics Cairo Egypt Abstract : With the increasing adoption of OVM/UV ...
- php数组函数-array_diff()
array_diff()函数返回两个数组的差集数组.该数组包括了所有在被比较数组中,但是不在任何其他参数数组中的键值在返回数组中,键名保持不变. array_diff(array1,array2,ar ...
- 如何通过http接口使用f12b实现批量提交链接
这里我们分别叙述了如何在浏览器直接使用此接口,以及通过java和python如何使用此接口. 一.以浏览器为例 (一)提交一个指令 serverURL=http://120.79.247.23/f12 ...
- iOS_mapKit与Core Location
目 录: 一.使用MKMap控件 二.根据地址定位 三.在地图上添加锚点 iOS从3.0版本开始提供了MapKit.frameword支持.该框架提供了一个可被嵌入到应用程序中的地图视图类MKMa ...
- Android编译系统环境过程初始化分析【转】
本文转载自:http://blog.csdn.net/luoshengyang/article/details/18928789 Android源代码在编译之前,要先对编译环境进行初始化,其中最主要就 ...
- Cisco路由器端口
Cisco的设备管理有很多种方式,如Console.HTTP.TTY.VTY或其它网管软件,但我们远程管理较为常用的一种方式肯定是VTY方式. VTY在Cisco的不同系列产品中,都有一定数量的VTY ...
- DB2日期及时间的使用
1.DB2中日期.时间寄存器的使用 --取日期 SELECT CURRENT DATE FROM sysibm.sysdummy1; --返回数据类型:DATE --结果集(YYYY-MM-DD): ...
- lockingModel in log4net 日志文件不能被其他进程写入
http://logging.apache.org/log4net/release/faq.html#single-file How do I get multiple process to log ...
- Spring中AOP的初窥和入门小案例
AOP:面向切面编程 AOP的主要作用:是为了程序员更好的关注"业务",专心"做事" 加上双引号的意思:所谓业务,是指他的核心,各行业中需要处理的核心事务,核心 ...