linux网络编程
leotoneo
ls all | grep only
https://github.com/leotoneo
展开
-
Socket编程实践(9) --select的限制与poll的使用
select的限制用select实现的并发服务器,能达到的并发数一般受两方面限制:1)一个进程能打开的最大文件描述符限制。这可以通过调整内核参数。可以通过ulimit -n(number)来调整或者使用setrlimit函数设置,但一个系统所能打开的最大数也是有限的,跟内存大小有关,可以通过cat /proc/sys/fs/file-max 查看[cpp] view pla转载 2015-11-04 21:16:47 · 377 阅读 · 0 评论 -
Linux多线程实践(4) --线程特定数据
线程特定数据[cpp] view plaincopyint pthread_key_create(pthread_key_t *key, void (*destr_function) (void *)); int pthread_key_delete(pthread_key_t key); int pthread_setspecific(pthread_key_转载 2015-11-10 09:42:24 · 417 阅读 · 0 评论 -
Linux多线程实践(6) --Posix读写锁解决读者写者问题
Posix读写锁[cpp] view plaincopyint pthread_rwlock_init(pthread_rwlock_t *restrict rwlock, const pthread_rwlockattr_t *restrict attr); int pthread_rwlock_destroy(pt转载 2015-11-10 20:38:58 · 626 阅读 · 0 评论 -
Socket编程实践(1) --TCP/IP简述
ISO的OSI OSI(open system interconnection)开放系统互联模型是由ISO国际标准化组织定义的网络分层模型,共七层, 从下往上为:OSI七层参考模型物理层(Physical Layer)物理层定义了所有电子及物理设备的规范,为上层的传输提供了一个物理介质,本层中数据传输的单位为转载 2015-10-26 21:16:26 · 276 阅读 · 0 评论 -
Socket编程实践(2) --Socket编程导引
什么是Socket? Socket可以看成是用户进程与内核网络协议栈的接口(编程接口, 如下图所示), 其不仅可以用于本机进程间通信,可以用于网络上不同主机的进程间通信, 甚至还可以用于异构系统之间的通信。 IPv4套接口地址结构 IPv4套接口地址结构通常也称为“网际套接字地址结构”,它以“sockaddr_in”命名,定义在头文件中转载 2015-10-26 21:18:07 · 281 阅读 · 0 评论 -
Linux多线程实践(3) --线程属性
初始化/销毁线程属性[cpp] view plaincopyint pthread_attr_init(pthread_attr_t *attr); int pthread_attr_destroy(pthread_attr_t *attr); 线程分离属性[cpp] view plaincopyint pthread_attr_转载 2015-11-10 09:53:21 · 331 阅读 · 0 评论 -
Linux多线程实践(8) --Posix条件变量解决生产者消费者问题
Posix条件变量[cpp] view plaincopyint pthread_cond_init(pthread_cond_t *cond, pthread_condattr_t *cond_attr); int pthread_cond_destroy(pthread_cond_t *cond); int pthread_cond_wait(pthread转载 2015-11-11 19:06:10 · 550 阅读 · 0 评论 -
Linux多线程实践(9) --简单线程池的设计与实现
线程池的技术背景 在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源。在Java中更是如此,虚拟机将试图跟踪每一个对象,以便能够在对象销毁后进行垃圾回收。所以提高服务程序效率的一个手段就是尽可能减少创建和销毁对象的次数,特别是一些很耗资源的对象创建和销毁。如何利用已有对象来服务(不止一个不同的任务)就是一个需要解决的关键问题,其实这就是一些"池化资转载 2015-11-11 20:45:27 · 625 阅读 · 0 评论 -
Socket编程实践(4) --多进程并发server
1.Socket地址复用[cpp] view plaincopyint getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen); int setsockopt(int sockfd, int lev转载 2015-10-27 21:36:03 · 284 阅读 · 0 评论 -
Socket编程实践(3) --Socket API
socket函数[cpp] view plaincopy#include #include int socket(int domain, int type, int protocol); 创建一个套接字用于通信参数: domain:指定通信协议族(protocol family),常用转载 2015-10-27 09:46:10 · 277 阅读 · 0 评论 -
Socket编程实践(5) --TCP粘包问题与解决
TCP粘包问题由于TCP协议是基于字节流且无边界的传输协议, 因此很有可能产生粘包问题, 问题描述如下 对于Host A 发送的M1与M2两个各10K的数据块, Host B 接收数据的方式不确定, 有以下方式接收: 先接收M1, 再接收M2(正确方式) 先接收M2, 再接收M1(错误) 一次性收到20k数据(错误)转载 2015-10-29 08:34:18 · 422 阅读 · 0 评论 -
Socket编程实践(6) --TCP服务端注意事项
僵尸进程处理1)通过忽略SIGCHLD信号,避免僵尸进程 在server端代码中添加 signal(SIGCHLD, SIG_IGN); 2)通过wait/waitpid方法,解决僵尸进程[cpp] view plaincopysignal(SIGCHLD,onSignalCatch);转载 2015-10-29 21:34:47 · 462 阅读 · 0 评论 -
Socket编程实践(7) --Select-I/O复用
五种I/O模型介绍(1)阻塞I/O[默认] 当上层应用App调用recv系统调用时,如果对等方没有发送数据(Linux内核缓冲区中没有数据),上层应用Application1将阻塞;当对等方发送了数据,Linux内核recv端缓冲区数据到达,内核会把数据copy给用户空间。然后上层应用App解除阻塞,执行下一步操作。 (2)非阻塞I/转载 2015-11-02 14:18:28 · 379 阅读 · 0 评论 -
Linux多线程实践(2) --线程基本API
POSIX线程库 与线程有关的函数构成了一个完整的系列,绝大多数函数的名字都是以“pthread_”开头,要使用这些函数库,要通过引入头文,而且链接这些线程函数库时要使用编译器命令的“-lpthread”选项[Ubuntu系列系统需要添加的是”-pthread”选项而不是”-lpthread”,如Ubuntu 14.04版本,深度Ubuntu等] 1.pthread_create转载 2015-11-09 21:37:45 · 338 阅读 · 0 评论 -
Linux多线程实践(5) --Posix信号量与互斥量解决生产者消费者问题
Posix信号量Posix 信号量有名信号量无名信号量sem_opensem_initsem_closesem_destroysem_unlink sem_waitsem_post 有名信转载 2015-11-10 20:36:59 · 515 阅读 · 0 评论 -
Socket编程实践(10) --epoll原理与封装
常用模型的特点 Linux 下设计并发网络程序,有典型的Apache模型(Process Per Connection,PPC), TPC(Thread Per Connection)模型,以及 select/polL模型和epoll模型。 1 、PPC/TPC 模型 这两种模型思想类似,就是让每一个到来的连接一边自己做事去,别再来烦我(详见本系列博客).只是 PPC转载 2015-11-05 17:49:30 · 438 阅读 · 0 评论 -
Socket编程实践(11) --UDP编程基础
UDP特点 无连接,面向数据报(基于消息,不会粘包)的数据传输服务; 不可靠(可能会丢包, 乱序, 重复), 但因此一般情况下UDP更加高效;UDP客户/服务器模型 UDP-API使用[cpp] view plaincopy#include #include ssize_t recvfrom(int sockfd转载 2015-11-06 09:39:34 · 413 阅读 · 0 评论 -
Linux IPC实践 --System V信号量(1)
信号量API[cpp] view plaincopy#include #include #include int semget(key_t key, int nsems, int semflg); int semctl(int semid, int semnum, int cmd, ...); int semop(int semid, struct se转载 2015-11-07 16:03:30 · 426 阅读 · 0 评论 -
Linux IPC实 --共享内存/内存映射
概述 共享内存区是最快的IPC形式。一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到内核,换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据(如图)。 共享内存 VS. 其他IPC形式 用管道/消息队列传递数据 用共享内存传递数据 共享内存生成之后,传递数据并不需要再走Linux内核,共享内存允许两个或多个进转载 2015-11-07 14:37:46 · 370 阅读 · 0 评论 -
Linux IPC实践 --System V共享内存
共享内存API[cpp] view plaincopy#include #include int shmget(key_t key, size_t size, int shmflg); void *shmat(int shmid, const void *shmaddr, int shmflg); int shmdt(const void *shmadd转载 2015-11-07 14:47:47 · 478 阅读 · 0 评论 -
Linux IPC实践--System V消息队列(1)
消息队列概述 消息队列提供了一个从一个进程向另外一个进程发送一块数据的方法(仅局限于本机); 每个数据块都被认为是有一个类型,接收者进程接收的数据块可以有不同的类型值. 消息队列也有管道一样的不足: (1)每个消息的最长字节数的上限(MSGMAX); (2)系统中消息队列的总条数也有一个上限(MSGMNI); (3)每个消息队列所能够保存的总字节数是有上限的(MSGMNB)转载 2015-11-06 20:11:44 · 345 阅读 · 0 评论 -
Linux IPC实践 --System V消息队列(2)
msgsnd函数[cpp] view plaincopyint msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg); 参数 msgid: 由msgget函数返回的消息队列标识码, 也可以是通过ipcs命令查询出来的一个已经存在的消息队列的ID号 msgp:是一个指针,指针指转载 2015-11-06 20:15:37 · 336 阅读 · 0 评论 -
Linux IPC实践--System V消息队列(3)
消息队列综合案例消息队列实现回射客户/服务器 server进程接收时, 指定msgtyp为0, 从队首不断接收消息server进程发送时, 将mtype指定为接收到的client进程的pid client进程发送的时候, mtype指定为自己进程的pidclient进程接收时, 需要将msgtyp指定为自己进程的pid, 只接收消息类型为自己pid的消息;[转载 2015-11-06 21:22:23 · 341 阅读 · 0 评论 -
Linux IPC实践--System V信号量(2)
实践1:信号量实现进程互斥父子进程执行流程如下:父进程子进程PPO(print)X(print)sleepsleepO(print)X(print)VVsleepsleep转载 2015-11-07 19:33:45 · 453 阅读 · 0 评论 -
Linux IPC实践--System V IPC综合实践
实践:实现一个先进先出的共享内存shmfifo 使用消息队列即可实现消息的先进先出(FIFO), 但是使用共享内存实现消息的先进先出则更加快速; 我们首先完成C语言版本的shmfifo(基于过程调用), 然后在此基础上实现C++版本的ShmFifo, 将1块共享内存与3个信号量(1个mutext信号量, 1个full信号量, 1个empty信号量)封装成一个类ShmFifo,转载 2015-11-07 20:53:04 · 432 阅读 · 0 评论 -
Linux IPC实践--Posix消息队列
1. 创建/获取一个消息队列[cpp] view plaincopy#include /* For O_* constants */ #include /* For mode constants */ #include mqd_t mq_open(const char *name, int oflag); //专用于打开一个转载 2015-11-09 14:38:40 · 406 阅读 · 0 评论 -
Linux多线程实践(1) --线程理论
线程概念 在一个程序里的一个执行路线就叫做线程(thread)。更准确的定义是:线程是“一个进程内部的控制序列/指令序列”; 一切进程至少有一个执行线程;进程 VS. 线程 1.进程是资源分配(进程需要参与资源的竞争)的基本单位,而线程是处理器调度(程序执行)的最小单位; 2.线程共享进程数据,但也拥有自己的一部分(非常少O(∩_∩)O~)数据,如线转载 2015-11-09 19:27:53 · 386 阅读 · 0 评论 -
Socket编程实践(8) --套接字IO超时设置方法
引:超时设置3种方案1. alarm超时设置方法[cpp] view plaincopy//代码实现: 这种方式较少用 void sigHandlerForSigAlrm(int signo) { return ; } signal(SIGALRM, sigHandlerForSigAlr转载 2015-11-02 19:55:00 · 1490 阅读 · 0 评论