网络编程
文章平均质量分 79
fantasy_linux
这个作者很懒,什么都没留下…
展开
-
unix网络编程基本编程
今天和大家分享一些基本套接口的编程函数,为帮助大家更好的理解connect、accept和close函数并使用netstat调试TCP应用程序,我们需要了解如何建立和终止TCP连接以及TCP的状态转换图。这样能够帮助我们编写网络程序的例子。 《一》三次握手: 下述步骤建立一个TCP连接: 1.服务器必须准备好接受外来的连接。这通原创 2016-03-12 18:49:54 · 2137 阅读 · 0 评论 -
三组I/O复用函数的比较
前面我们讨论了select、poll和epoll三组I/O复用系统调用,这三组系统调用都能同时监听多个文件描述符。它们将等待由timeout参数指定的超时时间,直到一个或多个文件描述符上有事件发生时返回,返回值是就绪的文件描述符的数量。返回0表示没有事件发生。现在我们从事件集、最大支持文件描述符数、工作模式和具体实现等四个方面进一步比较它们的异同,以明确在实际应用中应该选择使用哪个。 这原创 2016-06-06 22:10:42 · 521 阅读 · 0 评论 -
IO复用:select函数
IO模型:(1)阻塞式IO模型: 最流行的I/O模型是阻塞式I/O模型,默认情况下,所有的套接字都是阻塞的。如上图所示,进程调用recvfrom,其系统调用直到数据报到达且被复制到应用进程的缓冲区中或发生错误才返回。最常见的错误是系统调用被信号中断,我们说进程在从调用recvfrom开始到它返回的整段时间内是被阻塞的。recvfrom成功返回后,应用进程开始处理原创 2016-06-06 16:48:55 · 1551 阅读 · 0 评论 -
IO复用:poll函数
poll提供的功能与select函数类似,不过在处理流设备时,它能够提供额外的信息 。 #include int poll(struct pollfd *fdarray,unsigned long nfds,int timeout); 返回:若有就绪的描述符则为其数目,若超时则为0,若出错则为-1; 第一个参数是指向一个结构第一个元素的指针。每个数组元素都原创 2016-06-06 18:40:45 · 425 阅读 · 0 评论 -
traceroute程序剖析
traceroute允许我们确定IP数据报从本地主机游历到某个远程主机所经过的路径。 我们先来说明tranceroute的工作原理:是IP路由过程中对数据包TTL(Time to Live,存活时间)的处理。当路由器收到一个IP包时,会修改IP包的TTL(及由此造成的头部检测和checksum变化)。每收到一个包,检查这个的TTL是否是0或1.如果是,表明这个包还没有到达目的地,而且剩余原创 2016-06-07 17:32:36 · 4375 阅读 · 0 评论 -
基本的UDP套接字编程
在使用TCP编写的应用程序和使用UDP编写的应用程序之间存在一些本质的差异,其原因在于这两个传输层之间的差异:UDP是无连接不可靠的数据报协议,非常不同于TCP提供的面向连接的可靠字节流。然而相比TCP,有些场合确实更适合使用UDP,使用UDP编写的一些常见的应用程序有:DNS(域名系统)、NFS(网络文件系统)和SNMP(简单网络管理协议)。 上图给出了典型的UDP客户端/服务器程序的函原创 2016-06-02 19:55:21 · 573 阅读 · 0 评论 -
TCP的连接与终止
(1)三次握手:原创 2016-06-02 19:09:52 · 574 阅读 · 0 评论 -
同步机制--->互斥锁
互斥锁指代相互排斥,它是最基本的同步形式。互斥锁用于保护临界区,以保证任何时刻只有一个线程在执行其中的代码,或者任何一个时刻只有一个进程在执行其中的代码。保护一个临界区的代码的通常轮廓大体如下: lock_the_mutex(...) 临界区 unlock_the_mutex(...) Posix互斥锁被声明为具有pthread_mutex_t 数原创 2016-06-02 16:05:16 · 395 阅读 · 0 评论 -
基本的TCP套接字编程
上图基本展示了TCP客户端与服务器编程的基本的流程。1、面向连接编程(TCP)面向连接的网络应用程序开发流程比较固定,需要开发者创建服务器与客户端两个应用程序,通过网络是想进程间的通讯。● 服务器端流程1 创建套接字(socket)2 服务绑定(bind)3 服务侦听(listen)4原创 2016-06-02 17:43:55 · 1176 阅读 · 0 评论 -
ping程序剖析
在剖析ping之前我们先补充一点知识。。。 (1)结构体addinfo 头文件:#include struct addrinfo { int ai_flags; int ai_family; //AF_INET,AF_INET6,UNIX etc int ai_原创 2016-06-07 12:22:17 · 1314 阅读 · 0 评论 -
System V 消息队列 (每个客户一个队列)
今天将之前的一个服务器和多个客户端的例子改成给去往服务器的所有客户请求使用一个队列,给每个客户使用一个队列接收去往各个客户的服务器应答。 下面给出这样的设计: 服务器的队列有一个对客户来说众所周知的键,但是各个客户以IPC_PRIVATE键创建各自的队列,这里并未随请求传递本进程id,而是由每个客户把自己的私用队列的标识符传递给服务器,服务器把自己的应答发送到由客户指出的原创 2016-05-19 18:11:51 · 496 阅读 · 0 评论 -
System V 消息队列(多个客户和一个服务器)
今天主要和大家分享有关System V 消息队列一个服务器带多个客户端。客户端把进程ID用作消息类型。每个客户把自己的进程ID指定为msgrcv的type参数,这样服务器就可以很好的进行区分。。。。首先给出客户端的代码:#include"uitil.h"int main(int argc,char*argv[]){ int msqid; //客户端打开消息队列原创 2016-05-19 14:42:28 · 1151 阅读 · 0 评论 -
System V 消息队列
首先我们来看操纵System V消息队列的函数。 (1)msgget函数用于创建一个新的消息队列或访问一个已存在的消息队列 #include int msgget(key_t key,int oflag); 返回值是一个整数标识符。它是基于指定的key值产生的,而key即可以是ftok的返回值,也可以是常值IPC_PRIVATE. oflag表示读写权限值的原创 2016-05-18 21:26:40 · 387 阅读 · 0 评论 -
无亲缘关系的客户与服务器
今天给出一个简单的无亲缘关系的客户端与服务器之间的通信,客户端发送服务器端进行接收,服务器端发送客户端进行接收。 服务器端的程序:#include"utili.h"int main(int argc,char**argv){ int write_fd; int read_fd; //mkfifo用于创建有名管道, int res = mkfi原创 2016-05-17 20:29:18 · 298 阅读 · 0 评论 -
网络编程之FIFO
管道没有名字,因此它们最大的劣势在于只能用于有一个祖先进程的各个进程之间。我们无法在无亲缘关系的两个进程间创建一个管道并将它用作IPC通道(不考虑文件描述符)。 FIFO指先进先出,UNIX中的FIFO类似管道。它是一个单向的(半双工)的数据流。不同于管道的是,每个FIFO有一个路径名与之关联,从而允许无亲缘关系的进程访问同一个FIFO,FIFO也成为有名管道。 FIF原创 2016-05-17 20:02:54 · 567 阅读 · 0 评论 -
UNIX网络编程之管道
管道 所有式样的UNIX都提供管道。它由pipe函数创建。提供一个单路(单向)数据流。 函数原型: #include int pipe(int fd[2]) 该函数返回两个文件描述符:fd[0]和fd[1]。前者打开来读,后者打开来写。 单个进程中的管道: 两个不同进程间的通信:下面给出一个简原创 2016-05-17 19:34:10 · 346 阅读 · 0 评论 -
网络编程之僵尸进程
在讨论之前先给出一段代码,其中存在一个很大的隐患,就是僵尸进程!!!!可用top命令进行查看,如下图所示: 由上图可看出,存在1个zombie(僵尸进程)!!! 下面就给出具体的实现: config.h:#include #include #include #include #include #include #include #in原创 2016-03-14 19:03:51 · 687 阅读 · 0 评论 -
I/O复用:epoll函数
epoll函数是Linux特有的I/O复用函数。它在实现和使用上与select、poll有很大的差异。首先,epoll函数使用一组函数来完成任务,而不是单个函数。其次,epoll把用户关心的文件符上的事件放在内核里的一个事件表中,从而无须像select和poll那样每次调用都要重复传入文件描述符集或事件集。但epoll需要使用一个额外的文件描述符,来唯一标识内核中的这个事件表。这个文件描述符使用如原创 2016-06-06 21:00:08 · 605 阅读 · 0 评论