linux网络编程
文章平均质量分 77
jasonliuvip
这个作者很懒,什么都没留下…
展开
-
linux网络编程七:分散读readv和集中写writev
最近在看《linux高性能服务器编程》,在此做个日记,以激励自己,同时分享于有需要的朋友。1. 分散读readv 和 集中写writevreadv将数据从文件描述符读到分散的内存块中,即分散读。writev将多块分散的内存一并写入文件描述符中,即集中写。#include ssize_t readv(int fd, const struct iovec *vector, i原创 2014-03-30 18:33:44 · 4253 阅读 · 0 评论 -
linux网络编程十一:将程序后台化,以守护进程的方式运行
1. 代码#include #include #include #include #include #include #include bool daemonize(){ pid_t pid = fork(); if (pid < 0) { return false; } else if (pid > 0) { exit(0); } umask(0原创 2014-03-30 23:53:08 · 1952 阅读 · 0 评论 -
linux网络编程十八:统一事件源
信号是一种异步事件:信号处理函数和程序的主循环是两条不同的执行路线。原创 2014-04-09 23:09:45 · 1831 阅读 · 2 评论 -
linux网络编程二十:socket选项:SO_RCVTIMEO和SO_SNDTIMEO
SO_RCVTIMEO和SO_SNDTIMEO ,它们分别用来设置socket接收数据超时时间原创 2014-04-13 00:43:56 · 38197 阅读 · 0 评论 -
linux网络编程二十二:高性能定时器之时间轮
之前我们提到,基于排序链表的定时器存在一个问题:添加定时器的效率偏低。原创 2014-04-17 00:26:10 · 7608 阅读 · 0 评论 -
linux网络编程二十五:多进程编程之共享内存
共享内存是最高效的IPC机制,因为它不涉及进程之间的任何数据传输。这种高效率带来的问题是我们必须用其它辅助手段来同步进程对共享内存的访问,否则会产生竞态条件。linux共享内存的API都定义在sys/shm.h中,包括4个系统调用:shmget , shmat , shmdt , shmctl 。linux还提供了另一种利用mmap在无关进程之间共享内存的方式。这种方式无须任务文件原创 2014-05-12 13:41:13 · 1835 阅读 · 0 评论 -
linux网络编程十六:I/O复用的应用-poll简单实现聊天室程序
这次我们以poll为例实现一个简单的聊天室程序,实现让所有用户同时在线群聊,分为客户端和服务端两部分。客户端有两个功能:一是从标准输入终端读取用数据,并将用户数据发关至服务器;二是往标准输出终端打印服务器发送给它的数据。服务端功能是接收客户数据,并把客户数据发送给每一个登录到该服务器上的客户端(数据发送者除外)。1. 客户端使用poll监听用户输入和网络连接,并利用sp原创 2014-04-04 22:43:24 · 2121 阅读 · 1 评论 -
linux网络编程二十一:利用SIGALRM信号,实现一个简单的基于升序链表的定时器
由alarm和setitimer函数设置的实时闹钟一旦超时原创 2014-04-13 00:56:58 · 2063 阅读 · 0 评论 -
linux网络编程二十三:高性能定时器之时间堆
前面我们讨论的定时方案都是以固定的频率调用心跳函数tick,并在其中依次检测到期的定时器,然后执行到期定时器上的回调函数。设计定时器的另外一种思路是:将所有定时器中超时时间最小的一个作为心跳间隔。这样,一旦心跳函数tick被调用,超时时间最小的定时器必然到期,我们就可以在tick函数中处理该定时器。然后再次从剩余的定时器中找出超时时间最小的一个,并将这段最小时间设置为下一次心跳间隔。如此反原创 2014-04-29 20:58:15 · 5197 阅读 · 5 评论 -
linux网络编程十五:I/O复用的应用-非阻塞connect
connect系统调用的man手册中描述了connect出错时的一种errno值:EINPROGRESS这种错误发生在对非阻塞的socket调用connect,而连接又没建立时。根据 man 文档解释,在这种情况下我们可以调用 select 、 poll等函数来监听这个连接失败的socket上的错误。如果错误码是0,表示连接成功,否则连接失败。1. 代码实现原创 2014-04-03 21:53:24 · 1912 阅读 · 0 评论 -
linux网络编程十七:I/O复用的应用-同时处理TCP和UDP服务
在此之前,我们讨论的服务器程序都只监听一个端口。在实际应用中,有不少服务器程序能同时监听多个端口,比如超组服务xinet。从bind系统调用的参数看,一个socket只能绑定一个socket地址。因此,要监听多个端口就必须创建多个socket,并绑定到各个端口上。这样一来,服务器程序就需要同时管理多个监听socket,I/O复用技术就有了用武之地。另外,即使是同一个端口,如果服务器原创 2014-04-04 23:53:27 · 1392 阅读 · 0 评论 -
linux网络编程二十四:多进程编程之信号量
一、semget系统调用semget系统调用创建一个新的信号量集,或者获取一个已经存在的信号量集。key参数是一个键值,用来标识一个全局唯一的信号量集,就像文件名全局唯一的标识一个文件一样。要通过信号量通信的进程需要使用相同的键值来创建或获取该信号量。num_sems参数指定要创建或获取的信号量集中信号量的数目。如果是创建信号量,则该值必须指定;如果是获取已存在的信号量,则原创 2014-05-12 11:25:26 · 1330 阅读 · 0 评论 -
linux网络编程二十八:多线程编程之统一信号处理
1. 以下代码取自pthread_sigmask函数的man手岫原创 2014-05-19 16:04:12 · 1145 阅读 · 0 评论 -
linux网络编程二十七:多线程编程之信号量、互斥锁和条件变量
1. locker.h#ifndef __LOCKER_H__#define __LOCKER_H__#include #include #include class sem{public: sem() { if (sem_init(&m_sem, 0, 1) != 0) throw std::exception();原创 2014-05-19 15:25:32 · 1142 阅读 · 0 评论 -
linux网络编程二十六:多进程编程之消息队列
1、把子进程中打开的文件描述符传递给父进程。原创 2014-05-12 15:12:47 · 1252 阅读 · 0 评论 -
linux网络编程十九:用SIGURG检测外带数据是否到达
在linux环境下,内核通知应用程序外带数据到达主要有两种方法:1. I/O复用技术2. 使用SIGURG信号原创 2014-04-10 23:16:45 · 1695 阅读 · 1 评论 -
linux网络编程五:gethostbyname, getservbyname
最近在看《linux高性能服务器编程》,在此做个日记,以激励自己,同时分享于有需要的朋友。1. 根据主机名称获取主机的完整信息#include struct hostent *gethostbyname(const char *name);name参数为主机名返回的是hostent结构体的指针:#include struct hostent{ ch原创 2014-03-30 17:30:52 · 4546 阅读 · 1 评论 -
linux网络编程一:主机字节序与网络字节序的的判断
最近在看《linux高性能服务器编程》,在此做个日记,以激励自己,同时分享于有需要的朋友。 现代CPU的累加器一次能装载至少4字节(32位),即一个整数。那么这4字节在内存中排列的顺序将影响它被累加器装载成的整数值,这就是字节序问题。 字节序分大端字节序(big endian)和小端字节序(little endian),大端字字节序是指一个整数的高位字节原创 2014-03-30 13:21:11 · 2244 阅读 · 1 评论 -
linux网络编程八:高效的sendfile,实现零拷贝
最近在看《linux高性能服务器编程》,在此做个日记,以激励自己,同时分享于有需要的朋友。1. sendfile函数#include ssize_t sendfile(int out_fd, int in_fd, off_t *offset, size_t count);sendfile在两个文件描术符之间直接传递数据,完全在内核中操作,从而避免了内核缓冲区到用户缓冲区的拷贝原创 2014-03-30 18:49:58 · 1975 阅读 · 0 评论 -
linux网络编程二:基础socket, bind, listen, accept, connect
最近在看《linux高性能服务器编程》,在此做个日记,以激励自己,同时分享于有需要的朋友。1. 创建socket#include #include int socket(int domain, int type, int protocol); domain参数为底层协议族:PF_INET(用于IPv4),PF_INET6(用于IPv6);对于UNIX本地域协议族为PF_UN原创 2014-03-30 15:43:54 · 9281 阅读 · 0 评论 -
linux网络编程六:利用dup模拟实现一个基本的CGI服务器
最近在看《linux高性能服务器编程》,在此做个日记,以激励自己,同时分享于有需要的朋友。1. 重定向dup和dup2#include int dup(int file_descriptor);int dup2(int file_descriptor_one, int file_descriptor_two);dup创建一个新的文件描述符, 此描述符和原有的file_d原创 2014-03-30 17:53:25 · 1142 阅读 · 0 评论 -
linux网络编程三:recv, send 的调用
最近在看《linux高性能服务器编程》,在此做个日记,以激励自己,同时分享于有需要的朋友。#include #include ssize_t recv(int sockfd, void *buf, size_t len, int flags);ssize_t send(int sockfd, const void *buf, size_t len, int flags);原创 2014-03-30 16:03:42 · 1580 阅读 · 0 评论 -
linux网络编程四:socket选项: SO_REUSEADDR, SO_RCVBUF, SO_SNDBUF
最近在看《linux高性能服务器编程》,在此做个日记,以激励自己,同时分享于有需要的朋友。1. 读取和设置socket文件描述符属性:#include int getsockopt(int sockfd, int level, int option_name, void *option_value, socklen_t *restrict option_len);int原创 2014-03-30 16:53:35 · 14488 阅读 · 0 评论 -
linux网络编程九:splice函数,高效的零拷贝
最近在看《linux高性能服务器编程》,在此做个日记,以激励自己,同时分享于有需要的朋友。1. splice函数#include ssize_t splice(int fd_in, loff_t *off_in, int fd_out, loff_t *off_out, size_t len, unsigned int flags);splice用于在两个文件描述符之间移动数原创 2014-03-30 19:11:48 · 14146 阅读 · 9 评论 -
linux网络编程十:用tee在管道间复制数据,进行零拷贝操作
最近在看《linux高性能服务器编程》,在此做个日记,以激励自己,同时分享于有需要的朋友。1. tee函数#include ssize_t tee(int fd_in, int fd_out, size_t len, unsigned int flags);tee在两个管道文件描述之间复制数据,也是零拷贝操作。它的参数与splice相同,但fd_in和fd_out都必须是原创 2014-03-30 23:42:09 · 1661 阅读 · 1 评论 -
linux网络编程十二:简单模拟HTTP请求的读取和分析
最近在看《linux高性能服务器编程》,在此做个日记,以激励自己,同时分享于有需要的朋友。1. 我们简单模拟HTTP请求的读取和分析判断HTTP头部结束的依据是遇到一个空行,该空行仅包含一对回车换行符 。如果一次读操作没有读入HTTP请求的整个头部, 即没有遇到空行, 那么我们必须等待客户继续写数据并再次读入。因此,我们每完成一次读操作,就要分析新读入的数据中是否有空行。在寻找原创 2014-03-31 21:58:19 · 3167 阅读 · 0 评论 -
linux网络编程十三:I/O复用select
最近在看《linux高性能服务器编程》,在此做个日记,以激励自己,同时分享于有需要的朋友。I/O复用使得程序能够同时监听多个文件描述符,对提高程序的性能至关重要。通常,网络程序在下列情况下需要使用I/O复用技术:A. 客户端程序要同时处理多个socket。B. 客户端程序要同时处理用户输入和网络连接。比如:聊天室C. TCP服务器要同时监听socket和连原创 2014-03-31 23:27:28 · 1551 阅读 · 0 评论 -
linux网络编程十四:I/O复用epoll
epoll是linux特有的I/O复用函数,它在实现上与select、poll有很大差异。首先,epoll使用一组函数来完成任务,而不是单个函数。其次,epoll把用户关心的文件描述符上的事件放在内核里的一个事件表中,从而无需像select和poll那样每次调用都要重复传入文件描述符或事件集。但epoll需要使用一个额外的文件描述符,来唯一标识内核中的这个事件表。1. epoll_原创 2014-04-02 22:10:10 · 1390 阅读 · 0 评论 -
轮询调度算法(Round-Robin Scheduling)
轮询调度算法(Round Robin Scheduling)算法就是以循环的方式依次将请求调度不同的服务器,即每次调度执行i = (i + 1) mod n,并选出第i台服务器。算法的优点是其简洁性,它无需记录当前所有连接的状态,所以它是一种无状态调度。原创 2014-05-13 17:11:48 · 24867 阅读 · 1 评论