【linux 网络编程】
玛丽奥ZJY
这个作者很懒,什么都没留下…
展开
-
1.源代码的下载,编译和测试
一.源代码的下载和编译源代码下载地址:点击这里 , 下载下来得到unpv13e.tar.gz文件编译步骤: 解压缩zxvf unpv13e.tar.gztar zxvf unpv13e.tar.gz进入unpv13e文件夹中cd /unpv13e./configure//如果权限不够可以chmod改权限编译lib文件cd libmakecd .转载 2017-09-19 19:01:28 · 385 阅读 · 0 评论 -
【unp】unix网络编程卷1-->环境搭建(ubuntu14.04)
学习unp网络编程,树上的例子均存在#include "unp.h",故需要对环境进行配置。1. 到资源页下载unpv13e 2. 解压并将unpv13e 移动到相应的文件夹下3. 编译[cpp] view plain copy print?>$ cd unpv13e >~unpv13e转载 2017-08-22 16:11:09 · 365 阅读 · 0 评论 -
Linux进程间通信(IPC)编程实践(十)System V信号量---PV操作经典题目
[cpp] view plaincopy//P原语 //P(semaphore *S) wait(semaphore *S) { -- S->value; if (S->value < 0) { //将当前进程设置为阻塞状态 //将当前进程的PC...转载 2018-05-05 12:41:22 · 488 阅读 · 0 评论 -
Linux进程间通信(IPC)编程实践(九)System V信号量---封装一个信号量操作的工具集
System信号量集主要API[cpp] view plaincopy#include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> int semget(key_t key, int nsems, int semflg); int semctl(int semid, int semnum...转载 2018-05-05 12:23:08 · 250 阅读 · 0 评论 -
Linux进程间通信(IPC)编程实践(五)消息队列实现回射客户/服务器
在我的上一篇博文中,讲解了关于消息队列的msgsnd和msgrcv函数的使用,这里我们试着来实现一个回射客户/服务器。基本框架如下:对于客户端: 用进程的PID进行区分类型,发往服务器的类型(mtype)总是1,包含自己的PID,还有一行消息。对于回射服务器端: 创建一个消息队列,指定键值是1234,服务器不停地接受类型是1的消息,解析出数据部分的pid(mtext的前四个字节)——回射即可。注意...转载 2018-04-26 22:49:05 · 210 阅读 · 0 评论 -
Linux进程间通信(IPC)编程实践(三) 详解System V消息队列(1)
消息队列简介消息队列提供了一个从一个进程向另外一个进程发送一块数据的方法(本机);每个数据块都被认为是有一个类型,接收者进程接收的数据块可以有不同的类型值。消息队列也有管道一样的不足: (1)每个消息的最长字节数的上限(MSGMAX); (2)系统中消息队列的总条数也有一个上限(MSGMNI); (3)每个消息队列所能够保存的总字节数是有上限的(MSGMNB) . 消息队列与管道的区别:最主要的区...转载 2018-04-26 22:29:20 · 230 阅读 · 0 评论 -
Linux进程间通信(IPC)编程实践(二) FIFO命名管道
在前一篇文章中,我们讲解了如何使用匿名管道来在进程之间传递数据,同时也看到了这个方式的一个缺陷,就是这些进程都由一个共同的祖先进程启动,这给我们在不相关的的进程之间交换数据带来了不方便。这里将会介绍进程的另一种通信方式——命名管道,来解决不相关进程间的通信问题。什么是命名管道 命名管道也被称为FIFO文件,它是一种特殊类型的文件,它在文件系统中以文件名的形式存在,但是它的行为却和之前所讲的没...转载 2018-04-26 22:28:50 · 130 阅读 · 0 评论 -
Linux进程间通信(IPC)编程实践(一) 基本概念和匿名管道
进程间通信至少可以通过传送打开文件来实现,不同的进程通过一个或多个文件来传递信息,事实上,在很多应用系统里,都使用了这种方法。但一般说来, 进程间通信(IPC:InterProcess Communication)不包括这种似乎比较低级的通信方法。Unix系统中实现进程间通信的方法很多,而且不幸的是,极少方法能在所有的Unix系 统中进行移植(唯一一种是半双工的管道,这也是最原始的一...转载 2018-04-26 10:31:37 · 160 阅读 · 0 评论 -
Linux进程间通信(IPC)编程实践(0) 进程间通信简述和PV原语
进程的同步与互斥 进程同步: 多个进程需要相互配合共同完成一项任务。 进程互斥: 由于各进程要求共享资源,而且有些资源需要互斥使用,因此各进程间竞争使用这些资源,进程的这种关系为进程的互斥;系统中某些资源一次只允许一个进程使用,称这样的资源为临界资源或互斥资源, 而在进程中涉及到互斥资源的程序段叫临界区.对于多个进程的并发状态,进程是基于CPU时间片轮转的。我们可以从下面司机和售票员的关系...转载 2018-04-26 09:38:18 · 272 阅读 · 0 评论 -
select_socket详解
Select在Socket编程中还是比较重要的,可是对于初学Socket的人来说都不太爱用Select写程序,他们只是习惯写诸如connect、accept、recv或recvfrom这样的阻塞程序(所谓阻塞方式block,顾名思义,就是进程或是线程执行到这些函数时必须等待某个事件的发生,如果事件没有发生,进程或线程就被阻塞,函数不能立即返回)。可是使用Select就可以完成非阻塞(所谓非阻塞方式...转载 2018-04-20 12:03:20 · 1748 阅读 · 0 评论 -
使用gethostname()函数和gethostbyname()函数获取主机相关信息
gethostname() : 返回本地主机的标准主机名。原型如下:#include <unistd.h>int gethostname(char *name, size_t len);参数说明:这个函数需要两个参数:接收缓冲区name,其长度必须为len字节或是更长,存获得的主机名。接收缓冲区name的最大长度返回值:如果函数成功,则返回0。如果发生错误则返回-1。错误号存放在外部变...转载 2018-04-19 13:50:11 · 785 阅读 · 0 评论 -
浅谈网络I/O多路复用模型 select & poll & epoll
我们首先需要知道select,poll,epoll都是IO多路复用的机制。I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。但select,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的。select的基本用法:http://blog.csdn.ne...转载 2018-04-24 09:27:36 · 166 阅读 · 0 评论 -
Linux进程间通信(IPC)编程实践(十一)System V信号量---实现一个先进先出的共享内存shmfifo
使用消息队列即可实现消息的先进先出(FIFO), 但是使用共享内存实现消息的先进先出则更加快速; 我们首先完成C语言版本的shmfifo(基于过程调用), 然后在此基础上实现C++版本的ShmFifo, 将1块共享内存与3个信号量(1个mutext信号量, 1个full信号量, 1个empty信号量)封装成一个类ShmFifo, 然后编写各自的测试代码; shmfifo说明: 将申请到的共...转载 2018-05-05 12:49:27 · 461 阅读 · 0 评论 -
Linux进程间通信(IPC)编程实践(十二)Posix消息队列--基本API的使用
posix消息队列与system v消息队列的差别:(1)对posix消息队列的读总是返回最高优先级的最早消息,对system v消息队列的读则可以返回任意指定优先级的消息。(2)当往一个空队列放置一个消息时,posix消息队列允许产生一个信号或启动一个线程,system v消息队列则不提供类似机制。队列中的每个消息具有如下属性:1、一个无符号整数优先级(posix)或一个长整数类型(system...转载 2018-05-05 13:47:37 · 274 阅读 · 0 评论 -
Linux下简单线程池的实现
线程池的技术背景 在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源。在Java中更是如此,虚拟机将试图跟踪每一个对象,以便能够在对象销毁后进行垃圾回收。所以提高服务程序效率的一个手段就是尽可能减少创建和销毁对象的次数,特别是一些很耗资源的对象创建和销毁。如何利用已有对象来服务(不止一个不同的任务)就是一个需要解决的关键问题,其实这就是一些"池化资源"...转载 2018-05-08 17:56:17 · 281 阅读 · 0 评论 -
Linux多线程实践(六)使用Posix条件变量解决生产者消费者问题
前面的一片文章我们已经讲过使用信号量解决生产者消费者问题,那么什么情况下我们需要引入条件变量呢?这里借用 http://www.cnblogs.com/ngnetboy/p/3521547.html 的解释:假设有共享的资源sum,与之相关联的mutex 是lock_s.假设每个线程对sum的操作很简单的,与sum的状态无关,比如只是sum++.那么只用mutex足够了.程序员只要确保每个线程操...转载 2018-05-08 17:41:20 · 257 阅读 · 0 评论 -
Linux多线程实践(五 )Posix信号量和互斥锁解决生产者消费者问题
Posix信号量和System V信号量的一点区别:system v 信号量只能用于进程间同步,而posix 信号量除了可以进程间同步,还可以线程间同步。system v 信号量每次PV操作可以是N,但Posix 信号量每次PV只能是1。除此之外,posix 信号量还有命名和匿名之分(man 7 sem_overview):Posix 信号量有名信号量无名信号量sem_opensem_inits...转载 2018-05-08 17:32:13 · 360 阅读 · 0 评论 -
Linux多线程实践(四 )线程的特定数据
在单线程程序中,我们经常要用到"全局变量"以实现多个函数间共享数据, 然而在多线程环境下,由于数据空间是共享的,因此全局变量也为所有线程所共有。但有时应用程序设计中有必要提供线程私有的全局变量,仅在某个线程中有效,但却可以跨多个函数访问。POSIX线程库通过维护一定的数据结构来解决这个问题,这个些数据称为(Thread-specific-data或 TSD)。相关函数如下:[cpp] view p...转载 2018-05-07 21:56:01 · 152 阅读 · 0 评论 -
Linux多线程实践(三)线程的基本属性设置API
POSIX 线程库定义了线程属性对象 pthread_attr_t ,它封装了线程的创建者可以访问和修改的线程属性。主要包括如下属性:1. 作用域(scope)2. 栈尺寸(stack size)3. 栈地址(stack address)4. 优先级(priority)5. 分离的状态(detached state)6. 调度策略和参数(scheduling policy and paramete...转载 2018-05-07 17:50:44 · 149 阅读 · 0 评论 -
Linux多线程实践(二)线程基本API(POSIX)
我们知道,进程在各自独立的地址空间中运行,进程之间共享数据需要用进程间通信机制,有些情况需要在一个进程中同时执行多个控制流程,这时候线程就派上了用场,比如实现一个图形界面的下载软件,一方面需要和用户交互,等待和处理用户的鼠标键盘事件,另一方面又需要同时下载多个文件,等待和处理从多个网络主机发来的数据,这些任务都需要一个“等待-处理”的循环,可以用多线程实现,一个线程专门负责与用户交互,另外几个线程...转载 2018-05-07 17:05:38 · 199 阅读 · 0 评论 -
Linux多线程实践(一)线程基本概念和理论
线程概念 在一个程序里的一个执行路线就叫做线程(thread)。更准确的定义是:线程是“一个进程内部的控制序列/指令序列”; 对于每个进程至少有一个执行线程;进程 VS. 线程 1.进程是资源分配(进程需要参与资源的竞争)的基本单位,而线程是处理器调度(程序执行)的最小单位; 2.线程共享进程数据,但也拥有自己的一部分数据,如 线程ID、一组寄存器、堆栈、errno(错误代码)...转载 2018-05-07 16:44:06 · 151 阅读 · 0 评论 -
Linux进程间通信(IPC)编程实践(七)共享内存的使用-System V共享内存(API)
上一篇博文提到的系统调用mmap通过映射一个普通文件实现共享内存。那么本文中介绍的System V 共享内存则是通过映射特殊文件系统shm中的文件实现进程间的共享内存通信。也就是说,每个共享内存区域对应特殊文件系统shm中的一个文件。执行过程是先调用shmget,再调用shmat。对于每个共享的内存区,内核维护如下的信息结构,定义在<sys/shm.h>头文件中。[cpp] view ...转载 2018-04-27 13:07:57 · 165 阅读 · 0 评论 -
Linux进程间通信(IPC)编程实践(六)共享内存的使用-mmap
共享内存区是最快的IPC形式。一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到内核,换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据(如图)。共享内存和其他进程间通信方式的比较:用管道或者消息队列传递数据:使用共享内存传递数据:共享内存生成之后,传递数据并不需要再走Linux内核,共享内存允许两个或多个进程共享一个给定的存储区域,数据并不需要在多个进程之间进行复...转载 2018-04-27 12:14:57 · 219 阅读 · 0 评论 -
Linux进程间通信(IPC)编程实践(八)共享内存的使用-POSIX 共享内存(API)
1、Posix提供了两种在无亲缘关系进程间共享内存区的方法:(1)内存映射文件:先有open函数打开,然后调用mmap函数把得到的描述符映射到当前进程地址空间中的一个文件(上一篇博文所用到的就是)。(2)共享内存区对象:先有shm_open打开一个Posix IPC名字(也可以是文件系统中的一个路径名),然后调用mmap将返回的描述符映射到当前进程的地址空间。这两种方法都需要调用mmap,差别在于...转载 2018-05-05 13:53:05 · 217 阅读 · 0 评论 -
Linux下的socket编程实践(十一) 基本UDP编程细节
在我的这两篇博客中,简单介绍并实现了基于UDP(TCP)的windows(UNIX下流程基本一致)下的服务端和客户端的程序,本文继续探讨关于UDP编程的一些细节。http://blog.csdn.net/nk_test/article/details/47733307http://blog.csdn.net/nk_test/article/details/47756381下图是一个简单的UDP客户...转载 2018-04-24 09:27:44 · 2304 阅读 · 0 评论 -
Linux下的socket编程实践(十) epoll实现高并发的原理及其使用
在 linux 没有实现 epoll 事件驱动机制之前,我们一般选择用 selec t或者 poll 等IO多路复用的方法来实现并发服务程序(详见此链接)。在大数据、高并发、集群等一些名词唱得火热之年代,select 和 poll的用武之地越来越有限,风头已经被 epoll 占尽。 本文便来介绍 epoll 的实现机制,并通过对比其不同的实现机制,真正理解为何 epoll 能实现高并发。Epoll...转载 2018-04-23 10:28:44 · 1231 阅读 · 0 评论 -
Linux 网络编程——并发服务器的三种实现模型
[-]循环服务器与并发服务器模型UDP 循环服务器的实现方法TCP 循环服务器的实现方法三种并发服务器实现方法多进程并发服务器多线程服务器IO复用服务器服务器设计技术有很多,按使用的协议来分有 TCP 服务器和 UDP 服务器,按处理方式来分有循环服务器和并发服务器。循环服务器与并发服务器模型在网络程序里面,一般来说都是许多客户对应一个服务器(多对一),为了处理客户的请求,对服务端的程序就提出了特...转载 2018-04-20 10:30:28 · 136 阅读 · 0 评论 -
Linux 系统应用编程——网络编程(高级篇)
一、网络超时检测 在网络通信过程中,经常会出现不可预知的各种情况。例如网络线路突发故障、通信一方异常结束等。一旦出现上述情况,很可能长时间都不会收到数据,而且无法判断是没有数据还是数据无法到达。如果使用的是TCP协议,可以检测出来;但如果使用UDP协议的话,需要在程序中进行相关检测。所以,为避免进程在没有数据时无限制的阻塞,使用网络超时检测很有必要。1、套接字接收超时检测 ...转载 2018-06-21 10:19:04 · 790 阅读 · 0 评论 -
Linux 系统应用编程——网络编程(TCP 协议三次握手过程)
TCP(Transmission Control Protocol) 传输控制协议 TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接: 位码即tcp标志位,有6种标示:SYN ( synchronous 建立联机 ) ACK ( acknowledgement 确认 ) PSH ( push 传送 ) FIN ( finish ...转载 2018-06-21 10:19:10 · 178 阅读 · 0 评论 -
Linux 系统应用编程——网络编程(利用TCP/IP 模型分析数据传输过程)
(转载自:http://blog.sina.com.cn/s/blog_5ec353710101i892.html) TCP/IP参考模型是一个非常基础,而且也非常重要的基础框架,要想入门数通这是个必须掌握的基本概念,本文档通过一个简单的示例,结合参考模型来分析一下数通的基本过程。 网络环境非常简单,如下图所示,我们现在来分析一下PC去访问Webserver的WEB服务,整个数据通信过程是...转载 2018-06-21 10:19:16 · 228 阅读 · 0 评论 -
Linux 系统应用编程——网络编程(TCP/IP 数据包格式解析)
图中括号中的数字代表的是当前域所占的空间大小,单位是bit位。黄色的是数据链路层的头部,一共14字节绿色的部分是IP头部,一般是20字节紫色部分是TCP头部,一般是20字节最内部的是数据包内容黄色部分:链路层目的MAC:当前step目的主机的mac地址源MAC:当前step的源主机的mac地址类型:指定网络层所用的协议类型,通常是IP协议,0x0800绿色部分:网络层,这里用的是IP包头格式版本:...转载 2018-06-21 10:19:27 · 267 阅读 · 0 评论 -
Linux 系统应用编程——网络编程(I/O模型)
Unix下可用的5种I/O模型:阻塞I/O非阻塞I/OI/O复用(select和poll)信号驱动I/O(SIGIO)异步I/O(POSIX的aio_系列函数) 一个输入操作通常包括两个不同的阶段:1)等待数据准备好;2)从内核向进程复制数据; 对于一个套接字的输入操作,第一步通常涉及等待数据从网络中到达。当所等待分组到达时,它被复制到内核中某个缓冲区。第二步就是把数据从内核缓冲区复...转载 2018-03-18 11:30:52 · 202 阅读 · 0 评论 -
Linux 系统应用编程——网络编程(I/O模型)
Unix下可用的5种I/O模型:阻塞I/O非阻塞I/OI/O复用(select和poll)信号驱动I/O(SIGIO)异步I/O(POSIX的aio_系列函数) 一个输入操作通常包括两个不同的阶段:1)等待数据准备好;2)从内核向进程复制数据; 对于一个套接字的输入操作,第一步通常涉及等待数据从网络中到达。当所等待分组到达时,它被复制到内核中某个缓冲区。第二步就是把数据从内核缓冲区复制到应用进程缓...转载 2018-03-18 11:18:19 · 158 阅读 · 0 评论 -
Linux 系统应用编程——网络编程(常用命令解析)
1、telnet Telnet协议是TCP/IP协议族中的一员,是Internet远程登陆服务的标准协议和主要方式。它为用户提供了在本地计算机上完成远程主机工作的能力。在终端使用者的电脑上使用telnet程序,用它连接到服务器。终端使用者可以在telnet程序中输入命令,这些命令会在服务器上运行,就像直接在服务器的控制台上输入一样。可以在本地就能控制服务器。当我们使用Telnet登录进入...转载 2018-03-18 10:53:54 · 184 阅读 · 0 评论 -
Linux 系统应用编程——网络编程(服务器模型)
在网络通信过程中,服务端通常需要处理多个客户端。由于多个客户端的请求可能会同时到来,服务器端可采用不同的方法来处理。总体上来说,服务器端可采用两种模型来实现:循环服务器模型和并发服务器模型。 循环服务器模型是指服务器端依次处理每个客户端,直到当前客户端的所有请求处理完毕,再处理下一个客户端。这类模型的优点是简单,缺点显而易见。特别是TCP循环服务器模型,由于必须先处理完当前客户端,容...转载 2018-03-18 10:34:24 · 181 阅读 · 0 评论 -
Linux 系统应用编程——网络编程(基础篇)
一、网络体系结构1、OSI模型和TCP/IP 模型 网络体系结构指的是网络的分层结构以及每层使用的协议的集合。其中最著名的就是OSI协议参考模型,他是基于国际标准化组织(OSI)的建议发展起来的。它分为7个层次:应用层、表示层、会话层、传输层、网络层、数据链路层及物理层。这个7层的协议模型规定的非常细致和完善,但在实际中没有被广泛的使用,其中最重要的原因之一就是它过于复杂。尽管如此,它...转载 2018-03-18 10:27:09 · 288 阅读 · 0 评论 -
Socket编程(4)TCP粘包问题及解决方案
转载:http://www.cnblogs.com/QG-whz/p/5537447.html① TCP是个流协议,它存在粘包问题TCP是一个基于字节流的传输服务,"流"意味着TCP所传输的数据是没有边界的。这不同于UDP提供基于消息的传输服务,其传输的数据是有边界的。TCP的发送方无法保证对等方每次接收到的是一个完整的数据包。主机A向主机B发送两个数据包,主机B的接收情况可能是产生粘包问题的原因...转载 2018-04-24 09:28:10 · 175 阅读 · 0 评论 -
Socket编程实践(1) 基本概念
阅读目录1. 什么是socket2. IPV4套接口地址结构3. 网络字节序4. 字节序转换函数5. 地址转换函数6. 套接字类型 正文回到顶部1. 什么是socketsocket可以看成是用户进程与内核网络协议栈的编程接口。TCP/IP协议的底层部分已经被内核实现了,而应用层是用户需要实现的,这部分程序工作在用户空间。用户空间的程序需要通过套接字来访问内核网络协议栈。套接口是全双工的通信,它不仅...转载 2018-04-24 09:27:53 · 150 阅读 · 0 评论 -
Socket编程实践(2) Socket API 与 简单例程
阅读目录socket()函数bind() 函数listen()函数accept()函数connect()函数一个简单的socket 通信例程 正文在本篇文章中,先介绍一下Socket编程的一些API,然后利用这些API实现一个客户端-服务器模型的一个简单通信例程。该例子中,服务器接收到客户端的信息后,将信息重新发送给客户端。回到顶部socket()函数socket()函数用于创建一个套接字。这就好...转载 2018-04-24 09:27:58 · 585 阅读 · 0 评论 -
Linux下的socket编程实践(九) Select的限制和poll(并发的初步知识)
select的限制用select实现的并发服务器,能达到的并发数一般受两方面限制:1)一个进程能打开的最大文件描述符限制。这可以通过调整内核参数来改变。可以通过ulimit -n(number)来调整或者使用setrlimit函数设置(需要root权限),但一个系统所能打开的最大数也是有限的,跟内存大小有关,可以通过cat /proc/sys/fs/file-max 查看。2)select中的fd...转载 2018-04-23 10:27:48 · 378 阅读 · 0 评论