Linux网络编程
文章平均质量分 53
Linuxdianc
这个作者很懒,什么都没留下…
展开
-
18.2.7 SHTTPD支持方法的分析设计
18.2.7 SHTTPD支持方法的分析设计服务器dHTTP的方法仅支持GET,使用GET方法可以满足大多数的静态网页的应用。在对客户端的请求进行解析获得请求的方法为GET后,服务器端的方法实现主要分为如下几个部分:q 头部信息的组织。q 文件内容的发送。对客户端请求响应的头部信息主要包含HTTP版本、状态值、状态信息、当前日期、请求资源的最后修改日期、ETA原创 2009-12-21 17:14:00 · 578 阅读 · 0 评论 -
11.4 数据链路层访问
11.4 数据链路层访问在Linux下数据链路层的访问通常是通过编写内核驱动程序来实现的,在应用层使用SOCK_PACKET类型的协议族可以实现部分功能。原创 2009-12-21 15:30:00 · 584 阅读 · 0 评论 -
11.4.1 SOCK_PACKET类型
11.4.1 SOCK_PACKET类型建立套接字的时候选择SOCK_PACKET类型,内核将不对网络数据进行处理而直接交给用户,数据直接从网卡的协议栈交给用户。建立一个SOCK_PACKET类型的套接字使用如下方式: socket (AF_INET, SOCK_PACKET,htons(0x0003)); 其中AF_INET=2表示因特网协议族,SOCK_PACKET=10原创 2009-12-21 15:31:00 · 2098 阅读 · 1 评论 -
11.4.2 设置套接口以捕获链路帧的编程方法
11.4.2 设置套接口以捕获链路帧的编程方法在Linux下编写网络监听程序,比较简单的方法是在超级用户模式下,利用类型为SOCK_PACKET的套接口(用socket()函数创建)来捕获链路帧数据。Linux程序中需引用如下头文件: #include #include /*ioctl 命令*/#include /*ethhdr原创 2009-12-21 15:31:00 · 810 阅读 · 0 评论 -
11.4.6 定位UDP报头的编程方法
11.4.6 定位UDP报头的编程方法UDP的数据结构如图11.14所示。 图11.14 UDP数据结构示意图UDP的头部数据结构在文件中定义,代码如下: struct udphdr{ u_int16_t source; /*源地址端口*/ u_int16_t dest; /*目的地址端口*/ u_int原创 2009-12-21 15:39:00 · 697 阅读 · 0 评论 -
11.4.8 使用SOCK_PACKET编写ARP请求程序的例子
11.4.8 使用SOCK_PACKET编写ARP请求程序的例子本节利用SOCK_PACKET套接字进行ARP请求的程序设计,并给出代码的例子。1.ARP协议数据和结构包含以太网头部数据的ARP协议数据结构如图11.16所示。图11.16 ARP协议的数据示意图ARP的数据结构在头文件中定义,代码如下: struct arphdr{ __be1原创 2009-12-21 15:43:00 · 1525 阅读 · 1 评论 -
11.5 小 结
11.5 小 结本章介绍了网络套接字编程中比较高级的知识,通常这些知识只有在比较特殊的情况下才会使用,但是某些知识却是经常使用而不会察觉的,例如广播和多播。本章中利用广播获得服务器IP地址的方法是一个比较实用的案例,在完备的网络应用程序中经常使用。除了以上的知识,还有一些高级套接字的知识,限于篇幅没有进行介绍,例如带外数据、IP选项、路由套接字接口等。带外数据指当连接中的双方如原创 2009-12-21 15:46:00 · 532 阅读 · 0 评论 -
16.1.2 内核中网络部分流程简介
16.1.2 内核中网络部分流程简介网络协议栈是由若干个层组成的,网络数据的流程主要是指在协议栈的各个层之间的传递。在第7.2节里介绍了TCP网络编程的流程,一个TCP服务器的流程按照建立socket(),绑定(bind())地址端口,侦听端口listen(),接收连接accept(),发送数据send(),接收数据recv(),关闭socket()的顺序来进行。与此对应内核的处理过程也是按原创 2009-12-21 15:59:00 · 533 阅读 · 0 评论 -
16.1.4 sk_buff结构
16.1.4 sk_buff结构内核层和用户层在网络方面的差别很大,在内核的网络层中sk_buff结构占有重要的地位,几乎所有的处理均与此结构有关系。网络协议栈是一个层次架构的软件结构,层与层之间通过预订的接口传递报文。网络报文中包含了在协议各层使用到的各种信息。由于网络报文之间的大小不是固定的,因此采用合适的数据结构来存储这些网络报文就显得非常重要。1.结构sk_buff的原型在L原创 2009-12-21 16:10:00 · 760 阅读 · 0 评论 -
11.3.5 一个多播例子的服务器端
11.3.5 一个多播例子的服务器端下面是一个多播服务器的例子。多播服务器的程序设计很简单,建立一个数据包套接字,选定多播的IP地址和端口,直接向此多播地址发送数据就可以了。多播服务器的程序设计,不需要服务器加入多播组,可以直接向某个多播组发送数据。下面的例子持续向多播IP地址"224.0.0.88"的8888端口发送数据"BROADCAST TEST DATA",每发送一次间隔5s。原创 2009-12-21 15:28:00 · 882 阅读 · 0 评论 -
11.3.1 多播的概念
11.3.1 多播的概念多播,也称为“组播”,将网络中同一业务类型主机进行了逻辑上的分组,进行数据收发的时候其数据仅仅在同一分组中进行,其他的主机没有加入此分组不能收发对应的 数据。在广域网上广播的时候,其中的交换机和路由器只向需要获取数据的主机复制并转发数据。主机可以向路由器请求加入或退出某个组,网络中的路由器和交换机有选择地复制并传输数据,将数据仅仅传输给组内的主机。多原创 2009-12-21 15:19:00 · 634 阅读 · 0 评论 -
11.3 多 播
11.3 多 播单播用于两个主机之间的端对端通信,广播用于一个主机对整个局域网上所有主机上的数据通信。单播和广播是两个极端,要么对一个主机进行通信,要么对整个局域网上的主机进行通信。实际情况下,经常需要对一组特定的主机进行通信,而不是整个局域网上的所有主机,这就是多播的用途。原创 2009-12-21 15:19:00 · 371 阅读 · 0 评论 -
18.3.4 SHTTPD所请求URI解析的实现
18.3.4 SHTTPD所请求URI解析的实现服务器SHTTPD中URI解析主要包含“有害”字符的替换,即将以“%”开始的字符进行转换。例如将“%20”转换为“空格”。进行字符转换的函数为uri_decode(),代码 如下: static int uri_decode(char *src, int src_len, char *dst, int dst_len){原创 2009-12-21 17:24:00 · 730 阅读 · 0 评论 -
18.3.8 SHTTPD支持HTTP协议版本的实现
18.3.8 SHTTPD支持HTTP协议版本的实现服务器SHTTPD支持的HTTP协议版本为0.9、1.0和1.1,当协议的版本不为此范围时,返回错误值505,表示不支持的服务器版本。代码如下: len -= pos -p;p = pos;sscanf(p, "HTTP/%lu.%lu", &req->major,原创 2009-12-22 08:36:00 · 650 阅读 · 0 评论 -
18.4.4 使用不同的浏览器测试服务器程序
18.4.4 使用不同的浏览器测试服务器程序建立如下的超级文本文件index.html,将其放到“/usr/local/var/www/”目录下。 dHTTP测试页面祝贺!如果你看到此信息,表明dHTTP服务器运行正常! 运行服务器,不输入任何参数,则服务器会在端口8080侦听,网络资源的根目录为“/usr/local/var/www/原创 2009-12-22 08:43:00 · 611 阅读 · 0 评论 -
Linux网络编程—前言
前 言Linux操作系统已经成为目前最流行的开源操作系统,在服务器、嵌入式系统有着广泛的应用,并且逐步走入个人电脑的桌面操作系统。Linux的网络程序设计在服务器领域、嵌入式领域有着广泛的应用。例如Web服务器、P2P应用、嵌入式网络机顶盒、IPTV机顶盒、手持设备等,上述产品大部分采用了开源的Linux系统。因此,熟悉并且能够编写网络程序代码,构建自己的网络架构程序是十分重要的。本书全原创 2009-12-21 14:56:00 · 801 阅读 · 0 评论 -
第11章 高级套接字
第11章 高级套接字前面几章内容对通用的UDP、TCP的程序设计方法进行了介绍,本章介绍高级套接字的编程,包含UNIX域的函数、广播、多播、数据链路层的程序设计等在Linux网络程序设计中比较常用的方法,主要包括以下内容:q UNIX编程:介绍AF_UNIX协议族类型,特别是结构struct sockaddr_un、编程 方法;q 广播的知识:介绍广原创 2009-12-21 15:00:00 · 470 阅读 · 0 评论 -
11.1.1 UNIX域函数的地址结构
11.1.1 UNIX域函数的地址结构UNIX域的地址结构在文件中定义,结构的原型如下: #define UNIX_PATH_MAX 108struct sockaddr_un { sa_family_t sun_family; /*AF_UNIX协议族名称*/ char sun_path[UNIX_PATH_MAX];原创 2009-12-21 15:03:00 · 623 阅读 · 0 评论 -
11.1.2 套接字函数
11.1.2 套接字函数UNIX域的套接字函数和以太网套接字(AF_INET)的函数相同,但是当用于UNIX域套接字时,套接字函数有一些差别和限制,主要有如下几条。q 使用函数bind()进行套接字和地址的绑定的时候,地址结构中的路径名和路径名所表示的文件的默认访问权限为0777,即用户、用户所属的组和其他组的用户都能读、写和执行。q 结构sum_path中的路径原创 2009-12-21 15:04:00 · 574 阅读 · 0 评论 -
11.2.3 广播的示例
11.2.3 广播的示例本节中是一个服务器地址发现的代码,假设服务器为A,客户端为B。客户端在某个局域网启动的时候,不知道本局域网内是否有适合的服务器存在,它会使用广播在本局域网内发送特定协议的请求,如果有服务器响应了这种请求,则使用响应请求的IP地址进行连接,这是一种服务器/客户端自动发现的常用方法。1.广播例子简介如图11.5所示为使用广播的方法发现局域网上服务器的IP地址。服务原创 2009-12-21 15:16:00 · 510 阅读 · 0 评论 -
16.1.5 网络协议数据结构inet_protosw
16.1.5 网络协议数据结构inet_protosw第5章中对TCP/IP的网络协议族进行了介绍(IP、TCP、UDP等)。其中协议TCP、UDP、RAW在文件Linux-2.6.26.3/net/ipv4/af_inet.c中一个名为inet_init()的函数中进行了初始化(因为TCP和UDP都是inet簇协议的一部分)。inet_init()函数使用proto_register()函原创 2009-12-21 16:15:00 · 962 阅读 · 0 评论 -
18.3 SHTTPD各模块的实现
18.3 SHTTPD各模块的实现Web服务器SHTTPD中实现的模块有命令行解析、文件配置解析、多客户端支持、URI解析、请求方法的解析、请求方法的响应、CGI的支持、HTTP版本的支持、内容类型的实现、错误的处理方法、对目录列表的显示以及主函数的实现,本节对上述实现方法进行介绍。原创 2009-12-21 17:21:00 · 751 阅读 · 0 评论 -
18.3.1 SHTTPD命令行解析的实现
18.3.1 SHTTPD命令行解析的实现SHTTPD可以根据用户的命令行输入进行服务器的配置。在解析用户输入的参数后,对默认参数进行修改来启动服务器。1.配置文件的结构服务器SHTTPD的结构为conf_opts,主要包含CGI根路径、网络资源根路径、配置文件名、默认文件名、服务器侦听端口、最大客户端、超时时间及初始化线程数量。原型如下: struct conf_opts{原创 2009-12-21 17:21:00 · 961 阅读 · 0 评论 -
18.3.3 SHTTPD的多客户端支持的实现
18.3.3 SHTTPD的多客户端支持的实现服务器SHTTPD的多客户端支持框架的函数主要为Worker_ScheduleRun()和函数Worker_ScheduleStop(),这两个函数通过对结构struct worker_opts进行管理来控制线程的状态。结构struct worker_opts的原型如下: struct worker_opts{ pthread_原创 2009-12-21 17:23:00 · 761 阅读 · 0 评论 -
18.3.5 SHTTPD方法解析的实现
18.3.5 SHTTPD方法解析的实现服务器SHTTPD请求方法的解析比较简单,使用比较字符串的方法。建立一个表示请求方法的结构数组,逐个比较客户端请求方法的字符串和数组中成员请求方法的异同。请求方法的结构如下,ptr表示请求方法的名称,len表示请求方法的长度,type表示请求方法的类型。 typedef struct vec { char原创 2009-12-21 17:25:00 · 776 阅读 · 0 评论 -
18.3.9 SHTTPD内容类型的实现
18.3.9 SHTTPD内容类型的实现内容类型表示服务器支持资源的格式,例如文本格式、超文本格式、流媒体的多种格式等。定义的内容类型格式如下: enum{ MINET_HTML, MINET_HTM, MINET_TXT, MINET_CSS, MINET_ICO, MINET_GIF, MINET_JPG, MINET_JPEG原创 2009-12-22 08:37:00 · 835 阅读 · 0 评论 -
18.3.10 SHTTPD错误处理的实现
18.3.10 SHTTPD错误处理的实现服务器SHTTPD支持错误值绝大多数的错误响应,其错误代码定义如下: enum{ ERROR301=301, ERROR302=302, ERROR303, ERROR304, ERROR305, ERROR307= 307, ERROR400=400, ERROR401, ERROR402, ERROR403, E原创 2009-12-22 08:39:00 · 735 阅读 · 0 评论 -
18.4 SHTTPD的编译、调试和测试
18.4 SHTTPD的编译、调试和测试本节在之前代码的基础上建立源代码文件、建立Makefile、对文件进行编译,然后对SHTTPD服务器进行测试。原创 2009-12-22 08:41:00 · 1646 阅读 · 1 评论 -
18.4.1 建立源文件
18.4.1 建立源文件源文件主要有如下几个,数据结构基本都在shttpd.h中放置;配置参数的解析和获得在shttpd_parameters.c文件中实现;主函数在shttpd.c中实现;客户端请求的业务处理在文件shttpd_worker.c中;关于URI的分析在shttpd_uri.c文件中;而文件shttpd_request.c中则是对客户端请求的分析;shttpd_mine.c中放原创 2009-12-22 08:42:00 · 557 阅读 · 0 评论 -
18.2.4 SHTTPD的多客户端支持的分析设计
18.2.4 SHTTPD的多客户端支持的分析设计服务器SHTTPD的多客户端支持模块为此程序的主处理模块。在此模块中进行客户端连接的处理、请求数据的接收、响应数据的发送和服务线程的调度。模块的核心部分采用线程池的服务器模型,如图18.9所示。模块初始化的时候,建立线程池,其中的线程负责接收客户端的请求、解析数据并响应数据。当客户端请求到来的时候,主线程查看当前线程池中是否有空闲的工作线原创 2009-12-21 17:10:00 · 669 阅读 · 0 评论 -
18.2.3 SHTTPD配置文件解析的分析设计
18.2.3 SHTTPD配置文件解析的分析设计服务器SHTTPD的配置文件格式与一般的配置文件格式基本一致,即可以以“#”开头的注释行,或者按照“关键字=值”的格式书写。格式如下: [#注释|[空格]关键字[空格]=[空格]value]图18.7 命令行解析的含义对配置文件解析的程序设计流程如图18.8所示,先打开文件,然后进行配置文件中数据的处理,解析处理完毕后原创 2009-12-21 16:56:00 · 718 阅读 · 0 评论 -
18.2 SHTTPD的模块分析和设计
18.2 SHTTPD的模块分析和设计要实现SHTTPD服务器,需要对服务器的架构和模块进行仔细地分析,例如客户、服务器模式的选型,CGI的实现方法、命令行脚本的解析等。本节对18.1节中的需求进行仔细的分析,提供一种解决的方法。原创 2009-12-21 16:45:00 · 1317 阅读 · 1 评论 -
16.2.2 网络收发处理软中断的实现机制
16.2.2 网络收发处理软中断的实现机制网络收发的处理通过软中断进行处理,考虑到优先级问题,分别占用了向量表中的2号和3号软中断来分别处理接收和发送。网络协议栈的软中断机制的实现原理如图16.10所示。 图16.10 协议栈中的软中断架构示意图当网络的软中断事件发生之后,执行net_rx_action()或者net_tx_action()的软中断服务程序,该服务程序会原创 2009-12-21 16:19:00 · 744 阅读 · 0 评论 -
16.3 socket数据如何在内核中接收和发送
16.3 socket数据如何在内核中接收和发送socket数据在内核中的流程主要包含初始化、销毁、接收和发送网络数据。其过程涉及网卡驱动、网络协议栈和应用层的接口函数。原创 2009-12-21 16:21:00 · 722 阅读 · 0 评论 -
16.3.1 socket()的初始化
16.3.1 socket()的初始化创建socket()需要传递family、type、protocol这3个参数。创建socket()其实就是创建一个socket实例,然后创建一个文件描述符结构。创建套接字文件描述符会互相建立一些关联,即建立互相连接的指针,并且初始化这些对文件的写读操作映射到socket的read()、write()函数上来。在初始化套接字的时候,同时初始化sock原创 2009-12-21 16:21:00 · 1009 阅读 · 0 评论 -
16.3.2 接收网络数据recv()
16.3.2 接收网络数据recv()网络数据接收依次经过网卡驱动和协议栈程序,以DM9000A网卡为例进行介绍接收数据的过程。如图16.11所示,网卡在一个数据包到来时,会产生一个硬中断,网络驱动程序会执行中断处理过程:首先申请一个skb结构及pkt_len+5大小的内存用于保存数据,然后便将接收到的数据从网卡复制到这个skb的数据部分中。当数据从网卡中成功接收后,调用netif_rx原创 2009-12-21 16:22:00 · 705 阅读 · 0 评论 -
16.4 小 结
16.4 小 结本章介绍了Linux内核代码的架构,特别是网络相关的部分,并对结构sk_buff进行了详细的分析,简单分析了网络数据的流程。介绍了Linux的软中断方式,对网络协议栈中使用的软中断处理报文队列的方式进行了简单介绍。对插口层的网络数据发送接收的流程进行了分析。原创 2009-12-21 16:25:00 · 481 阅读 · 0 评论 -
第18章 一个简单Web服务器的
第18章 一个简单Web服务器的例子SHTTPD在第6章的用户空间网络程序简介中对HTTP协议进行了简单的介绍,本章将实现一个简单的Web服务器程序——SimpleHTTPDemo,简称SHTTPD。这个Web服务器可以实现简单的用户配置、静态网页响应等功能。按照如下步骤进行设计和编写程序:q 定义需求,明确需求定义。q 对需求进行分析,明确实现的方式和关键的问题原创 2009-12-21 16:26:00 · 610 阅读 · 0 评论 -
18.1 SHTTPD的需求分析
18.1 SHTTPD的需求分析Web服务器SHTTPD可以实现动态配置、多客户访问、CGI支持、支持HTTP/1.0版本,最终能实现简单的可用型Web服务器,多种浏览器可以正常访问SHTTPD上的网页,如图18.1所示。本节对SHTTPD的功能进行说明。 图18.1 多浏览器访问支持原创 2009-12-21 16:27:00 · 764 阅读 · 0 评论 -
18.1.2 SHTTPD的多客户端支持的需求
18.1.2 SHTTPD的多客户端支持的需求SHTTPD支持多个客户端的并发连接,在同一时刻允许多个客户端同时成功获得服务器上的网页资源,这是现代服务器的基本属性。SHTTPD启动时的处理单元初始化了两个,并发访问数量为2,当客户端增加时,会自动根据现场情况增加处理单元,最大为4个。如图18.3所示,两个客户端同时对SHTTPD进行访问,均能获得其响应信息“欢迎”。如图18.4所示原创 2009-12-21 16:33:00 · 607 阅读 · 0 评论