摘要: /*Linux网络编程(五)——多路IO复用之select()网络编程中,使用IO复用的典型场合:1.当客户处理多个描述字时(交互式输入以及网络接口),必须使用IO复用。2.一个客户同时处理多个套接口。3.一个tcp服务程序既要处理监听套接口,又要处理连接套接口,一般需要用到IO复用。4.如果一个服务器既要处理TCP,又要处理UDP,一般也需要用到IO复用。5.如果一个服务器要处理多个服务或者多个协议,一般需要用到IO复用。*//***********************************************************************本程序功能:使用单进程为 阅读全文
posted @ 2013-11-14 08:45 mkdir 阅读(810) 评论(0) 推荐(0) 编辑
摘要: 在编写程序时,我们经常回用到定时器。本文讲述如何使用select实现超级时钟。使用select函数,我们能实现微妙级别精度的定时器。同时,select函数也是我们在编写非阻塞程序时经常用到的一个函数。首先看看select函数原型如下:int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);参数说明:slect的第一个参数nfds为fdset集合中最大描述符值加1,fdset是一个位数组,其大小限制为__FD_SETSI... 阅读全文
posted @ 2013-11-02 22:26 mkdir 阅读(6903) 评论(0) 推荐(0) 编辑
摘要: 1. 引言一般我们编程的时候,函数中形式参数的数目通常是确定的,在调用时要依次给出与形式参数对应的实际参数。但在某些情况下我们希望函数的参数个数可以根据需要确定,因此c语言引入可变参数函数。典型的可变参数函数的例子有printf()、scanf()等。例如:printf(“hello,world!”);其参数个数为1个。printf(“a=%d,b=%s,c=%c”,a,b,c);其参数个数为4个。如何编写可变参数函数呢?我们首先来看看printf函数原型是如何定义的。在linux下,输入man 3 printf,可以看到prinf函数原型如下:SYNOPSIS#include int pri 阅读全文
posted @ 2013-10-31 16:16 mkdir 阅读(942) 评论(0) 推荐(0) 编辑
摘要: 在linux网络编程【1-3】中,我们编写的网络程序仅仅是为了了解网络编程的基本步骤,实际应用当中的网络程序并不会用那样的。首先,如果服务器需要处理高并发访问,通常不会使用linux网络编程(三)中那样的多进程方式,因为那样相当耗系统资源。实际当中,网络程序多使用select、poll、epoll等多路IO复用来进行编写。在进入主题之前,我们先来了解一下linux的IO模型。现有的linux IO模型有5种:阻塞式IO模型,非阻塞式IO模型,IO复用模型,信号驱动式IO模型,异步IO模型。关于阻塞、非阻塞、同步、异步,甚至并发等待,这些概念一直没有很好的理解,特意翻阅一些资料和博文,汇总如下: 阅读全文
posted @ 2013-10-30 15:40 mkdir 阅读(672) 评论(0) 推荐(0) 编辑
摘要: Linux网络编程(三) wait()还是waitpid()Linux网络编程(二)存在客户端断开连接后,服务器端存在大量僵尸进程。这是由于服务器子进程终止后,发送SIGCHLD信号给父进程,而父进程默认忽略了该信号。为避免僵尸进程的产生,无论我们什么时候创建子进程时,主进程都需要等待子进程返回,以便对子进程进行清理。为此,我们在服务器程序中添加SIGCHLD信号处理函数。代码如下:#include #include #include #include #include #include #include #include #include #define SERV_PORT 1113#def 阅读全文
posted @ 2013-10-30 08:27 mkdir 阅读(1276) 评论(2) 推荐(4) 编辑
摘要: Linux网络编程(二) 使用多进程实现服务器并发访问。采用多进程的方式实现服务器的并发访问的经典范例。程序实现功能:1.客户端从标准输入读入一行文字,发送到服务器.2.服务器接收到客户端发来的文字后,原样返回给客户端.3.客户端接收到服务器的发来的文字后,输出到标准输出,然后继续以上步骤。服务器端过程:建立好监听套接字后,等待客户端的连接,接收到一个连接后,创建一个子进程来与客户端进行通信,主进程则继续等待其他客户端的连接。代码如下:#include #include #include #include #include #include #include #include #include 阅读全文
posted @ 2013-10-29 20:32 mkdir 阅读(1129) 评论(3) 推荐(2) 编辑
摘要: 关于双链表实现,一般教科书上定义一个双向链表节点的方法如下:struct list_node{stuct list_node *pre;stuct list_node *next;ElemType data; }即一个链表节点包含:一个指向前向节点的指针、一个指向后续节点的指针,以及数据域共三部分。但查看linux内核代码中的list实现时,会发现其与教科书上的方法有很大的差别。来看看linux是如何实现双链表。双链表节点定义struct list_head { struct list_head *next, *prev;};发现链表节点中根本就没有数据域,这样的链表有什么用?linux内核中 阅读全文
posted @ 2013-10-29 09:02 mkdir 阅读(1492) 评论(3) 推荐(1) 编辑
摘要: 一.概念介绍网络程序分为服务端程序和客户端程序。服务端即提供服务的一方,客户端为请求服务的一方。但实际情况是有些程序的客户端、服务器端角色不是这么明显,即互为客户端和服务端。我们编写网络程序时,一般是基于TCP协议或者UDP协议进行网络通信的。TCP:(Transfer Control Protocol)传输控制协议是一种面向连接的协议, 当我们的网络程序使用这个协议的时候,网络可以保证我们的客户端和服务端之间的传输是可靠的。UDP:(User Datagram Protocol)用户数据报协议是一种非面向连接的协议, 这种协议并不能保证我们的网络程序的连接是可靠的。我们编写的网络程序具体采用 阅读全文
posted @ 2013-10-26 12:33 mkdir 阅读(1370) 评论(2) 推荐(2) 编辑
摘要: 【链表】Q:Implement an algorithm to find the nth to last element of a singly linked list .题目:找出链表的倒数第n个节点元素。解答: 方法一:利用两个指针p,q,首先将q往链表尾部移动n位,然后再将p、q一起往后移,那么当q达到链表尾部时,p即指向链表的倒数第n个节点。node* find_nth_to_last(node* head,int n) { if(head==NULL || nnext; } if(n>=0) return NULL; while(p!=NULL && q!=NU 阅读全文
posted @ 2013-10-20 09:28 mkdir 阅读(223) 评论(0) 推荐(0) 编辑
摘要: 【链表】Q:Implement an algorithm to delete a node in the middle of a single linked list, given only access to that node EXAMPLEInput: the node ‘c’ from the linked list a->b->c->d->eResult: nothing is returned, but the new linked list looks like a->b->d->e题目:实现算法来删除单链表中的中间节点(只知道指向该节点 阅读全文
posted @ 2013-10-20 09:27 mkdir 阅读(250) 评论(0) 推荐(0) 编辑