志存高远

专注于C/C++

排序:
默认
按更新时间
按访问量

Linux网络编程--服务端判断客户端断开的经验方法

法一: 当recv()返回值小于等于0时,socket连接断开。但是还需要判断 errno是否等于 EINTR,如果errno == EINTR 则说明recv函数是由于程序接收到信号后返回的,socket连接还是正常的,不应close掉socket连接。   法二:   struct tcp_i...

2016-03-07 15:41:36

阅读数:4977

评论数:4

Linux网络编程--IO模型基础

IO的方式有阻塞IO、非阻塞IO模型、IO复用、信号驱动、异步IO等,本文以UDP为例大概介绍这几种IO模型的基础知识和原理。 1.阻塞IO 阻塞IO是最通用的IO类型,使用这种模型进行数据接收的时候,在数据没有到之前程序会一直等待。 2.非阻塞IO模型 3.IO复用 4.信...

2015-09-10 16:33:11

阅读数:1210

评论数:0

linux中对errno是EINTR的处理

慢系统调用(slow system call):此术语适用于那些可能永远阻塞的系统调用。永远阻塞的系统调用是指调用有可能永远无法返回,多数网络支持函数都属于这一类。如:若没有客户连接到服务器上,那么服务器的accept调用就没有返回的保证。 EINTR错误的产生:当阻塞于某个慢系统调用的...

2016-05-18 15:53:24

阅读数:4037

评论数:0

多进程并发编程----基于高级的预先创建进程池(accept使用线程上锁)的模型

本博文介绍如何使用线程对accept进程加锁保护。 使用线程对accept加锁,不仅适用于同一进程内各线程之间的上锁,同样适用于不同进程之间的上锁。 实现要点: 1 互斥变量必须存放在所有进程共享的内存区域内 2 告知线程函数库这是不同进程之间共享的互斥锁 服务端程序的代码如下: #inclu...

2016-04-25 17:56:06

阅读数:949

评论数:0

多进程并发编程----基于高级的预先创建进程池(accept使用文件上锁)的模型

本篇博文讲解如何使用fcntl文件上锁的方式对accept进行保护。 如果多个进程在引用同一个监听套接字的描述符上调用accept,对于不同的内核accept不一定都是原子操作。Berkeley的内核支持这种模型,而system V就会出现问题,那么我们的解决方法之一就是本博文讲解的使用文件上锁保...

2016-04-25 17:43:45

阅读数:390

评论数:0

多进程并发编程----基于高级的动态创建进程池的模型

此篇博文主要讲解如何动态创建进程的方法,此方法模型如下: main{ ps=socket(); bind(); listen(); while(1){ cs=accept(); if(cs){ pid=fork(); if(pid==0){//...

2016-04-21 18:01:03

阅读数:449

评论数:0

多进程并发编程----基于高级的预先创建进程池(accept不上锁)的模型

此篇博文先介绍最简单的服务器并发模型,此模型的大概框架如下: main{ socket(); bind(); listen(); for(i=0;i pid=fork(); if(pid==0)//子进程 do_child(); } waitpid(); close(fd); } do_child...

2016-04-21 16:45:09

阅读数:636

评论数:0

Linux网络编程--select,poll和epoll的区别

在Linux Socket服务器短编程时,为了处理大量客户的连接请求,需要使用非阻塞I/O和复用,select、poll和epoll是Linux API提供的I/O复用方式,自从Linux 2.6中加入了epoll之后,在高性能服务器领域得到广泛的应用,现在比较出名的nginx就是使用epoll来...

2016-04-14 14:53:49

阅读数:696

评论数:0

Linux网络编程--recv函数返回值详解

recv函数 int recv( SOCKET s, char FAR *buf, int len, int flags); 不论是客户还是服务器应用程序都用recv函数从TCP连接的另一端接收数据。 该函数的第一个参数指定接收端套接字描述符;  第二个参数指明一个缓冲区,该缓冲区用来存放...

2016-04-13 14:37:50

阅读数:8805

评论数:1

Linux网络编程--使用epoll,共享内存技术实现高性能的聊天室程序

本篇博文主要介绍使用epoll和多进程的共享内存技术实现高性能的聊天室的服务器程序。#include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <asser...

2016-03-28 10:25:49

阅读数:1696

评论数:0

Linux网络编程--使用epoll模型同时处理tcp和udp服务

在实际工作中,服务器需要同时监听和处理tcp和udp的套接字,同时监听N多的端口。根据bind系统调用来讲,一个socket只能监听一个端口,因此要创建多个socket并绑定到各个端口上。当然同一个端口可以同时绑定tcp和udp的socket,但是要创建两个socket,一个是tcp的一个是udp...

2016-03-22 14:43:47

阅读数:2658

评论数:2

Linux网络编程--epoll模型ET触发模式之epolloneshot事件

epoll模型的ET模式一般来说只触发一次,然而在并发程序中有特殊情况的存在,譬如当epoll_wait已经检测到socket描述符fd1,并通知应用程序处理fd1的数据,那么处理过程中该fd1又有新的数据可读,会唤醒其他线程对fd1进行操作,那么就出现了两个工作线程同时处理fd1的情况,这当然不...

2016-03-21 15:24:22

阅读数:1234

评论数:0

Linux网络编程--epoll模型之LT触发模式和ET触发模式

epoll对文件描述符有两种操作模式--LT(level trigger电平模式)和ET(edge trigger边缘模式) 简单来讲,LT是epoll的默认操作模式,当epoll_wait函数检测到有事件发生并将通知应用程序,而应用程序不一定必须立即进行处理,这样epoll_wait函数再次检...

2016-03-21 14:38:46

阅读数:2083

评论数:0

Linux网络编程--sendfile零拷贝高效率发送文件

本博文介绍使用sendfile函数进行零拷贝发送文件,实现高效数据传输,并对其进行验证。 那么什么是sendfile呢? linux系统使用man sendfile,查看sendfile原型如下: #include        ssize_t sendfile(int out_fd, int ...

2016-03-11 15:24:11

阅读数:9356

评论数:1

Linux网络编程--定时器之时间堆

相比较时间轮,时间堆的效率更高,主要利用最小堆的思想实现。 具体实现过程如下: #ifndef intIME_HEAP #define intIME_HEAP #include #include #include using std::exception; #define BUFFE...

2016-03-10 15:40:58

阅读数:826

评论数:0

Linux网络编程--定时器之时间轮

由于基于升序定时器链表的添加定时器效率偏低,所以本博文介绍一种高效的定时器---时间轮; 时间轮:包含时间间隔si,时间轮槽数N,运行一周所用的时间是si*N。每一个槽就是一个无序的定时器链表,并且拥有统一的特征,定时时间相差N*si整数倍。 时间轮的优势在于采用哈希表的思想,将定时器散列在不...

2016-03-10 15:29:57

阅读数:989

评论数:0

Linux网络编程--定时器的学习和使用

linux网络编程需要处理的重要事件之一--定时事件,对于服务器而言,管理着众多的客户端连接,高效稳定的管理这些客户端,定时事件是必不可少的,也对服务器的性能有着至关重要的作用。本博文先介绍简单的定时事件,以便于下一篇介绍高性能定时器做铺垫。 1.使用setsockopt设置socket选项SO_...

2016-03-10 14:25:52

阅读数:1441

评论数:0

libevent---主要函数

event_int(初始化libevent实例) struct event_base * event_init(void) 初始化事件处理框架实例,内部调用event_base_new。 event_base_new的主要逻辑: 代码  1 struct event_base ...

2016-03-08 15:10:16

阅读数:1114

评论数:0

libevent---源代码结构

Libevent 的源代码虽然都在一层文件夹下面,但是其代码分类还是相当清晰的,主要可分为头文件、内部使用的头文件、辅助功能函数、日志、libevent 框架、对系统 I/O 多路复用机制的封装、信号管理、定时事件管理、缓冲区管理、基本数据结构和基于 libevent的两个实用库等几个部分,有些部...

2016-03-08 14:49:30

阅读数:567

评论数:0

libevent---socket异步编程

libevent的使用 --  socket异步编程 这篇文章介绍下libevent在socket异步编程中的应用。在一些对性能要求较高的网络应用程序中,为了防止程序阻塞在socket I/O操作上造成程序性能的下降,需要使用异步编程,即程序准备好读写的函数(或接口)并向系统注册,然后在需要...

2016-03-04 15:34:18

阅读数:529

评论数:0

提示
确定要删除当前文章?
取消 删除
关闭
关闭