Ubuntu下实现的网络编程
文章平均质量分 91
根据《unix网络编程》卷一,在Ubuntu下实现主要的程序,给出运行结果及完整源代码。仍在更新中……
Sunshine_top
安安静静、认认真真完成自己的事情
展开
-
半同步/半反应堆模型(使用线程池)的TCP服务器例子
在半同步/半异步模式中“同步”和“异步”与I/O模型中同步、异步的概念不同:I/O模型中,同步和异步区分的是内核向应用程序通知的是何种I/O事件(是就绪事件还是完成事件),以及该由谁来完成I/O读写(是应用程序还是内核)。在并发模式中,“同步”指的是程序完全按照代码序列的顺序执行;“异步”指的是程序的执行需要由系统事件来驱动(常见的系统事件包括中断、信号)。**异步线程**的执行的执行效率高,实时原创 2015-08-30 17:06:32 · 4423 阅读 · 0 评论 -
两种高效的服务器设计模型:Reactor和Proactor模型
I/O模型在文章《unix网络编程》(12)五种I/O模型中提到了五种I/O模型,其中前四种:阻塞模型、非阻塞模型、信号驱动模型、I/O复用模型都是同步模型;还有一种是异步模型。Reactor模型 Reactor模式是处理并发I/O比较常见的一种模式,用于同步I/O,中心思想是将所有要处理的I/O事件注册到一个中心I/O多路复用器上,同时主线程/进程阻塞在多路复用原创 2015-05-30 18:25:14 · 27718 阅读 · 2 评论 -
UNIX域协议
文章参考UNP,例子也来源于该书。 Unix域协议并不是一个实际的协议族,而是在单个主机上执行客户/服务器通信的一种方法,所使用的API就是在不同主机上执行客户/服务器通信所用的API(套接字API)。 Unix域套接字仅仅复制数据,并不执行协议处理,不需要添加或删除网络报头,无需计算校验和,不要产生顺序号,无需发送确认报文。Unix域套接字提供流和数据报两种接口。Unix原创 2015-05-29 10:13:12 · 1511 阅读 · 0 评论 -
关于The C10K problem的一些资料
英文原文:http://www.kegel.com/c10k.html两篇中文翻译:http://www.cnblogs.com/fll/archive/2008/05/17/1201540.htmlhttp://blog.csdn.net/goldou/article/details/2579781从C10k到C500K:http://www.360doc.c原创 2015-05-17 15:44:54 · 1684 阅读 · 0 评论 -
TCP和UDP区别
TCP和UDP区别TCP和UDP是OSI模型中的运输层中的协议。TCP提供可靠的通信传输,而UDP则常被用于让广播和细节控制交给应用的通信传输。UDP(User Datagram Protocol) UDP不提供复杂的控制机制,利用IP提供面向无连接的通信服务。并且它是将应用程序发来的数据在收到的那一刻,立刻按照原样发送到网络上的一种机制。 即使是出原创 2015-05-12 09:45:54 · 1634 阅读 · 0 评论 -
《unix网络编程》(21)守护进程和inetd超级服务器
守护进程(daemon)是在后台运行且不与任何控制终端关联的进程。UNIX系统有很多守护进程在后台工作(有20到50的数量级),执行不同的管理任务。 守护进程没有控制终端通常源于它们由系统初始化脚本启动。然而守护进程也可能从某个终端由用户在shell提示符下键入命令行启动,这样的守护进程必须亲自脱离于控制终端的关联,从而避免与作业的控制、终端会话管理、终端产生信号等发原创 2015-04-23 19:01:49 · 1804 阅读 · 0 评论 -
《unix网络编程》(20)名字与地址转换函数
域名系统(Domain Name System, DNS)主要用于主机名字与IP地址之间的映射。gethostbyname / gethostbyaddr函数通过计算机主机名字来查找。如果查找成功,返回的指向hostent结构的指针,该结构包含所查找主机的所有IPv4地址。这个函数局限于返回IPv4地址。#include #include struct hostent *get原创 2015-04-22 19:04:02 · 1592 阅读 · 0 评论 -
网络术语MSL/TTL/RTT
MSL(Maximum Segment Lifetime)最大报文生存时间 每个TCP实现必须选择一个MSL。它是任何报文段被丢弃前在网络内的最长时间。这个时间是有限的,因为TCP报文段以IP数据报在网络内传输,而IP数据报则有限制其生存时间的TTL时间。RFC 793指出MSL为2分钟,现实中常用30秒或1分钟。2MSL 当TCP执行主动关闭,并发出最原创 2015-04-17 15:00:09 · 13882 阅读 · 0 评论 -
《unix网络编程》(19)使用select的TCP和UDP回射程序
TCP和UDP服务器端程序注意:信号处理函数可能中断对select的调用,因此要处理EINTR错误//udpservselect01.c#include "myheader.h"void str_echo(int sockfd) { ssize_t n; char buf[MAXLINE];again: while (( n = read(sockfd,原创 2015-04-16 22:18:35 · 1502 阅读 · 0 评论 -
《unix网络编程》(18)基本UDP套接字 简单客户服务器回射程序及改进
基本TCP套接字参考《unix网络编程》(8)基本TCP套接字套接字函数#include #include ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *from, socklen_t *addrlen);ssize_t原创 2015-04-14 19:44:18 · 1976 阅读 · 0 评论 -
《unix网络编程》(17)套接字选项
getsockopt和setsockopt函数#include int getsockopt(int sock, int level, int optname, void *optval, socklen_t *optlen); int setsockopt(int sock, int level, int optname, const void *optval, socklen原创 2015-04-13 20:14:04 · 1625 阅读 · 0 评论 -
apache与nginx实现原理对比
Apache与Nginx:Apache与Nginx的性能谁更高效,取决于其服务器的并发策略以及其面对的场景:并发策略: 我们目前使用的 Apache是基于一个线程处理一个请求的非阻塞IO并发策略 。这种方式允许一个进程中通过多个线程来处理多个连接,其中每个线程处理一个连接。Apache使用其worker模块实现这种方式,目的是减少perfork模式中太多进程的开销,使得a转载 2015-04-11 11:36:20 · 2654 阅读 · 0 评论 -
Linux 套接字编程中的 5 个隐患
转自:http://www.ibm.com/developerworks/cn/linux/l-sockpit/在 4.2 BSD UNIX® 操作系统中首次引入,Sockets API 现在是任何操作系统的标准特性。事实上,很难找到一种不支持 Sockets API 的现代语言。该 API 相当简单,但新的开发人员仍然会遇到一些常见的隐患。本文识别那些隐患并向您显示如何避开它们。转载 2015-04-11 11:29:49 · 2019 阅读 · 0 评论 -
腾讯公司后台服务器经典面试题 (2009年5月)
转自http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=1484141&page=1前些时间去了腾讯面试, 可惜现场没回答好。是一些基础问题,同时也比较深入的问题。 在此列出来, 欢迎大家讨论交流。提问(不按时间顺序):1, 使用Linux epoll模型,水平触发模式(Level-Triggered);当so转载 2015-04-11 11:07:43 · 2132 阅读 · 0 评论 -
UNIX网络编程——epoll的ET/LT模式注意点
epoll模型有两种工作模式,ET和LT两种模式下都有一些细节值得注意,以下是一些思考: 一、ET模式下Q1:调用accept时,到底TCP完成队列里有多少个已经建立好的连接?这里又得分情况来说:没有连接。这种情况发生在TCP连接被客户端夭折,即在服务端调用accept之前客户端给出一个RST。该RST导致刚刚建立好的连接从服务器端的TCP完成队列中被移出。源自be转载 2015-04-11 10:32:29 · 1748 阅读 · 0 评论 -
UNIX网络编程——epoll 的accept , read, write
在一个非阻塞的socket上调用read/write函数,返回EAGAIN或者EWOULDBLOCK(注:EAGAIN就是EWOULDBLOCK)。 从字面上看,意思是: EAGAIN: 再试一次 EWOULDBLOCK:如果这是一个阻塞socket, 操作将被block perror输出:Resource temporarily unavailable总结转载 2015-04-11 10:29:04 · 1735 阅读 · 0 评论 -
《unix网络编程》(16)epoll函数
几种模型的比较1 PPC、TPC模型 传统的网络服务器是用一个单独的线程或进程处理每一个连接。对于高性能的应用,这需要在某一个时刻同时处理大量的客户请求,这种模式效率不高,因为(Process Per Connection,PPC), TPC(Thread Per Connection)模型一次处理许多客户连接,那么随着连接客户的增多,那么资源使用、进程/线程环境切换等的时空原创 2015-04-09 20:16:32 · 4048 阅读 · 2 评论 -
《unix网络编程》(15)poll函数以及使用poll的客户服务器程序
select存在一个明显缺陷:中定义的FD_SETSIZE常值是数据类型fd_set中描述符总数,其值通常为1024。当今的Unix版本允许每个进程使用无限数目的描述符(受限于内存总量和管理性),然而增加描述符集大小的唯一方法是先增大FD_SETSIZE,而要重新编译内核才行。原创 2015-04-06 14:40:06 · 1850 阅读 · 0 评论 -
《unix网络编程》(14)使用select、shutdown的客户服务器程序
文章《unix网络编程》(11)tcp服务器的几种常见状况分析分析了我们之前的客户服务器程序(《unix网络编程》(10)wait/waitpid处理僵死进程(SIGCHLD信号))存在的问题。客户端 如下修改程序中,客户的str_cli函数用select重写,一旦服务器进程终止,客户就能立刻得到通知。之前程序阻塞于fgets,这里阻塞于select调用(或等待标准输入可读、或原创 2015-04-05 21:15:02 · 1587 阅读 · 0 评论 -
《unix网络编程》(13)select、shutdown函数
《unix网络编程》(11)tcp服务器的几种常见状况分析的“服务器进程终止”提到客户阻塞于fgets所以没办法收到服务器发的FIN,只有当客户再次输入文本并发送给服务器后才会从套接字中读取,这时才知道服务器的状态。但这可能已经过了很长时间。这样的进程就需要预先告知内核的能力,使得内核一旦发现进程指定的一个或多个I/O条件就绪(即,输入已经准备好读取,或描述符能够承接更多输出),它就通知进程。这种原创 2015-04-04 22:00:32 · 1552 阅读 · 0 评论 -
《unix网络编程》(12)五种I/O模型
《unix网络编程》(11)tcp服务器的几种常见状况分析的“服务器进程终止”提到客户阻塞于fgets所以没办法收到服务器发的FIN,只有当客户再次输入文本并发送给服务器后才会从套接字中读取,这时才知道服务器的状态。但这可能已经过了很长时间。这样的进程就需要预先告知内核的能力,使得内核一旦发现进程指定的一个或多个I/O条件就绪(即,输入已经准备好读取,或描述符能够承接更多输出),它就通知进程。这种原创 2015-04-04 21:09:48 · 4286 阅读 · 0 评论 -
《unix网络编程》(11)tcp服务器的几种常见状况分析
accept返回前连接终止 《unix网络编程》(10)wait/waitpid处理僵死进程(SIGCHLD信号)该文章中介绍了客户正常终止时,由于父进程使用wait处理SIGCHLD信号时,阻塞于accept,内核会使得accept返回一个EINTR错误(被中断的系统调用)。 另一种情形也会导致accept返回非致命的错误:三次握手完成后,客户TCP发送一个原创 2015-04-04 19:44:23 · 1703 阅读 · 0 评论 -
《unix网络编程》(10)wait/waitpid处理僵死进程(SIGCHLD信号)
僵尸进程处理 在之前的文章《unix网络编程》(9)TCP客户/服务器示例:TCP回射》中,提到客户正常断开但服务器未处理SIGCHLD信号,会使得服务器子进程僵死。 设置僵尸进程的目的: 维护子进程信息,以便父进程在以后某时候获取。信息包括子进程IP,终止状态,资源利用信息(CPU时间、内存使用量等)。如果某进程结束,该进程的子进程处于僵死状态,那么原创 2015-04-03 22:08:11 · 2079 阅读 · 0 评论 -
《unix网络编程》(9)TCP客户/服务器示例:TCP回射
源码利用文章《《unix网络编程》(8)基本TCP套接字》中的套接字函数可以设计一个如下简单的客户服务器的例子。//服务器端tcpsrv01.c#include "../myheader.h"/*从客户端读入数据,并将数据回射到客户端。*/void str_echo(int sockfd) { ssize_t n; char buf[1024];aga原创 2015-04-03 20:31:30 · 1840 阅读 · 0 评论 -
《unix网络编程》(8)基本TCP套接字
套接字函数socket函数创建一个套接字用于通信:#include int socket(int family, int type, int protocol); //成功返回非负的描述符,出错返回-1/*参数: family:指定通信协议族(protocol family),常用取值AF_INET(IPv4) type:指定socket类型,原创 2015-04-01 14:28:28 · 1572 阅读 · 0 评论 -
《unix网络编程》(7)socket概述
socket什么是socket socket可以看成是用户进程与内核网络协议栈的接口(编程接口, 如下图所示),其不仅可以用于本机进程间通信,可以用于网络上不同主机的进程间通信,甚至还可以用于异构系统之间的通信。IPv4套接字地址结构 IPv4套接口地址结构通常也称为“网际套接字地址结构”,它以“sockaddr_in”命名,定义在头文原创 2015-04-01 10:42:58 · 1620 阅读 · 0 评论 -
《unix网络编程》(6)网络字节序 大端模式和小端模式
大端模式和小端模式的定义a) Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。b) Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。c) 网络字节序:TCP/IP各层协议将字节序定义为Big-Endian,因此TCP/IP协议中使用的字节序通常称之为网络字节序。高/低字节有一个32位无符号原创 2015-03-24 10:03:04 · 1971 阅读 · 0 评论 -
《unix网络编程》(5)常见的因特网协议应用
原创 2015-03-22 21:09:54 · 1414 阅读 · 0 评论 -
《unix网络编程》(4)缓冲区大小及限制
介绍影响IP数据报大小的限制。数据报大小 IPv4的数据报最大大小是65535字节,包括IPv4首部。因为首部中说明大小的字段(总长度字段)为16位。 IPv6的数据报最大大小是65575字节,包括40字节的IPv6首部。同样是展16位,但是IPv6首部大小不算在里面,所以总大小比IPv4大一个首部(40字节)。MTU 最大传输单元(m原创 2015-03-22 20:40:26 · 2072 阅读 · 0 评论 -
《unix网络编程》(3)TCP连接的建立和终止
TCP通过为每个字节关联一个序列号对所发送的数据进行排序。 为了很好地理解connect、accept、close这三个函数并使用netstat程序调试TCP应用,必须了解TCP建立和终止并掌握TCP的状态转换图。三次握手 (1)服务器必须准备好接受外来连接。通常通过socket、bind和listen函数来完成,称之为被动打开(passive o原创 2015-03-22 18:02:13 · 2082 阅读 · 0 评论 -
《unix网络编程》(2)网络模型和协议概述
OSI模型OSI(open system interconnection)开放系统互联模型是由ISO(国际标准化组织,International Organization for Standardization)定义的网络分层模型,共七层。 网络层由IPv4和IPv6两个协议处理。可以选择的传输层协议有TCP和UDP。上图的TCP与UDP之间留有空隙,表明网络应用可原创 2015-03-16 20:57:18 · 1630 阅读 · 0 评论 -
《unix网络编程》(1)源代码的使用方法
《unix网络编程(卷1)》源码下载地址可以从这里免费下载源码Ubuntu下源码的使用方法将下载的源码在Ubuntu下解压;控制台内进入解压后源码所在的目录。打开文件README,其内容如下:QUICK AND DIRTY===============Execute the following from the src/ directory: ./configu原创 2015-03-15 20:27:18 · 2700 阅读 · 0 评论