随笔分类 - Linux Socket
摘要:一个实际的网络工程不论我们的头脑是否在由上一章的学习中清醒过来,现在我们需要休息一下了。在这一章我们并不讨论新的内容,而是用我们所学到的这些东西来实现一些有趣的事情。在学习了这么多的东西之后来一些有趣的东西是十分重要的。在这一章,我们将会:应用TCP/IP套接口从网上下载股票行情信息应用UDP广播和我们的局域网内发布股票行情信息使用UDP客户端程序来接收局域网广播的股票行情信息问题描述在提供解决方案之前进行问题描述是一个很好的习惯。所以,在这里我们要描述一下在这一章我们将会解决的问题。我们有一个全职或是兼职的小公司。我们的办公室很小,所以免费得到一些行情信息是十分重要的。另外,我们需要关注我们
阅读全文
摘要:传送证书与文件描述符如要我们要与其他的用户共享我们的Linux主机,那么我们一定会为资源访问权限问题而困扰。在这一章,我们将会了解如何由一个本地套接口获得证书以及如何通过套接口传送文件描述符。这两个重要特性为我们用户的安全访问解决方案提供了一个全新的路径,因为我们要确保我们机器的安全。这些特性是能过使用套接口的附属数据来提供的。这是一个高级主题,而这超出了初级程序的理解范围。初学者也许希望简单的跳过这一章而直接进入下一章的学习。而高级用户也许希望仔细研究这一章,因为这里介绍了处理附属数据的问题。在这里我们将重点放在可以研究或实验的实际的例子。这一章涉及下列主题:如何向一个本地服务器进程发送一个
阅读全文
摘要:网络安全编程这本书直到这个地方,我们一直在注意如何编写使用套接口的程序,而不论其是客户端还是服务器程序。但是我们却并没有级出安全编程的考虑来对抗外在的威胁,这些威胁可以是来自Internet或是我们局域网内部的一些别有用心的人。在这一章,我们将会介绍以下内容:inetd守护进程如何与TCP包装器概念配合来提供客户的检查TCP包装器概念是如何工作的当我们结束这一章,我们将会理解TCP包装器概念是如何工作的,并且会了解到如何将其应用到我们管理或是自已编写的服务器上。定义安全Merriam Webster的学院字典用各各方式定义了安全。而我们感兴趣的是下面的两种定义方式:当受危险控制的质量或状态对抗
阅读全文
摘要:使用inetd守护进程运行在Unix下在的第一个服务器通常都会提供一个作为单独进程运行的服务。然而,当要提供的服务数量变得很大时,这会成为系统的一个负担。这是因为资源必须与每一个正在运行的服务器进程相关联,甚至是对当前正在提供的服务并没有请求时也是如此。另外,我们可以观察到大多数据的服务器程序使用通常的进程来创建,绑定,监听,与接受新的客户连接。对于无连接的服务器操作与是相似的观察结果。在这一章,我们将会了解以下内容:什么是inetd守护进程?inetd如何解决资源使用问题?inetd如何简化服务器编写?大多数服务器的通常步骤如果我们回忆一下第8章,服务器的面向连接协议,我们就会回忆起一个面向
阅读全文
摘要:带外数据这一章我们将使用TCP来处理带外数据。我们将会学习为什么要提供带外数据以及他的缺点。然而,最重要的是,我们可以正确的应用他所支持的各种协议来处理通信的带外模式。这一章,我们将会学到下列内容:定义什么是带外数据为什么需要带外数据套接口使用带外数据的相关问题在TCP/IP实现中有哪些变化如何中配合TCP流套接口使用带外数据定义带外数据想 像一下在银行人们排起队等待处理他们的帐单。在这个队伍中每个人最后都会移到前面由出纳员进行服务。现在想像一下一个走入银行,越过整个队伍,然后用枪抵 住出纳员。这个就可以看作为带外数据。这个强盗越过整个队伍,是因为这把枪给了他凌驾于众人的权力。出纳员也会集中注
阅读全文
摘要:使用UDP进行广播如果通信只能在两个单体之间完成,这样的方式是没有效率的。另一方面,广播允许同时要多个接收者传播信息。在这一章,我们将会学习下列内容:建立一个UDP广播套接口使用套接口发送广播信息使用套接口接收广播信息在学完这一章之后,我们就会知道如何使用IPv4套接口广播程序来编写程序。理解广播地址要使用广播,我们必须了解IPv4的特定广播地址编写。我们可以记起IP地址可以分为左边的网络ID部分以及右边的主机ID部分。广播地址所用的约定就是主机ID位全部设置为1。当我们的网卡正确配置以后,我们可以用下面的命令来显示我们所选用接口的广播地址:# ifconfig eth0eth0 Link e
阅读全文
摘要:套接口选项在前面的几章中,我们讨论了使用套接口的基础内容。现在我们要来探讨一些可用的其他的特征。在我们掌握了这一章的概念之后,我们就为后面的套接口的高级主题做好了准备。在这一章,我们将会专注于下列主题:如何使用getsockopt(2)函数获得套接口选项值如何使用setsockopt(2)函数设置套接口选项值如何使用这些常用的套接口选项得到套接口选项有时,一个程序需要确定为当前为一个套接口进行哪些选项设置。这对于一个子程序库函数尤其如此,因为这个库函数并不知道为这个套接口进行哪些设置,而这个套接口需要作为一个参数进行传递。程序也许需要知道类似于流默认使用的缓冲区的大小。允许我们得到套接口选项值
阅读全文
摘要:并发客户端服务器到现在为止我们所介绍的这些服务器 程序,在接受下一个客户端连接之前只处理一个客户端请求。这对于即时回复的服务器来说是高效且简单的。然而,如果处理要花费较长时间,或者有一段不活动时 期,这样的设计就会无限制的阻止其他客户端的连接。因为服务器通常在最小的延迟时间内服务尽可能多的客户端,在服务器的连接端需要一个基础设计的改变。在这一章,我们将会学到下面的一些内容:为处理多个客户端连接使用fork(2)函数wait(2)与waitpid(2)函数处理多个客户端连接的select(2)函数掌握了这些内容可以使得我们编写一次处理大量客户端的专业级服务器。理解多客户端的问题图11.1显示了多
阅读全文
摘要:在套接口上使用标准I/O在前面章节的例子代码中我 们已经使用了read(2)或是write(2)系统调用在套接口上执行读取和写入操作。这个规则的一个例外就是recvfrom(2)和sendto (2)函数,这两个函数用来读写数据报。然而,使用read和writte函数调用却有一些程序上的缺点。这一章我们将会讨论以下内容:如何使用fdopen(3)将一个套接口与一个FILE流相关联如何创建并读写FILE流关闭与套接口相关联的流的问题为我们的FILE流选择并创建合适的缓冲技术中断系统调用的问题掌握了这些内容将为我们提供解决我们网络程序的额外方法。理解标准I/O的需要Linux中的stdio(3)程
阅读全文
摘要:主机名与网络名查询在这一章,我们将会了解以下内容:如何确定我们的本地主机名如何将主机名解析为IP地址如何将IP地址解析为主机名一旦我们学完这一章,我们就可以在我们的客户端与服务器程序中使用主机名或是IP地址。理解名字的需要人们喜欢使用和记住名字,而不是IP地址。在网络世界中,名字实际上为我们解决了许多问题:他们为一个网站提供了人类友好的引用他们可以允许IP地址改变,而名字保持不变他们允许为同一个主机或是服务指定多个IP地址我们已经理解比起IP地址来,名字提供了更为简单的引用。然而,另外一点就是名字可以保持不变,而允许主机的IP地址发生变化。IP地址的变化通常是因为网络的变化,ISP的变化,设备
阅读全文
摘要:面向无连接的协议直到这时,我们实际了忽略了套接口通信的大部分内容。相反,我们关注于创建套接口,绑定地址以及关闭套接口。现在我们要实际使用套接口了。对于套接口有两种基本的通信模式。他们是面向无连接的通信与面向连接的通信。在这一章,我们将会了解下面内容:面向无连接通信与面向连接通信之间的区别如何执行无连接的输入与输出操作如何编写一个数据报服务器如何编写一个数据报客户端现在我们来关注一下面向无连接通信与面向连接通信之间的区别。通信方法正如我们所想到的,面向无连接的通信在通信开始之前并不需要建立连接。这就像一个拿着护音器在嘈杂中向一个人喊话一样。对于每一次新的喊话,发送消息的人可以将他的话传递到另一个
阅读全文
摘要:将地址绑定到一个套接口在前面的章节中我们准备了足够的知识来创建套接,并且格式化套接口地址。这一章将会这些基础上进行扩展我们将会理解bind是如何工作的,并且如何来正确的使用。在这一章,我们将会学到下列内容:bind函数如何将一个地址赋给一个套接口如何由一个已经具有地址的套接口得到本地套接口地址如何得到同等的套接口地址bind如何选择用于通信的网络接口bind函数的目的当我们用socket函数创建套接口时,他们是无名套接口。当演示socket函数时,这些套接口没有地址,但是也可以使用。然而,这些套接口可以工作只是因为他们是用这样的方法来创建的,在同一个Linux内核内。对于连接两个不同的主机的套
阅读全文
摘要:套接口类型与协议在第一章我们看到了如何使用socketpair函数来创建一对本地套接口。在这一章我们将会了解使用socket函数来创建一个套接口。通常情况下这两个函数都有域,套接口类型,以及协议参数。这一章将会建立在前几章的基础之上,并且主要关注于socket函数调用。这包括下面的一些内容:域参数套接口类型参数协议参数指定一个套接口的域在 第一章,我们可以看到,对于socketpair函数,域参数必须为AF_LOCAL或是AF_UNIX(这两个值是等同的)。然后在第二章,我们可以注 意到我们使用了socket函数调用,并且将其域参数指定为AF_INET。在这些以及其他的情况下,我们可以推测出域
阅读全文
摘要:地址转换函数上一章中,我们已经了可以分配与初始化各种类型的套接口。这些是由一个常量进行初始化的简单例子。由一个使用变化地址的C字符串设置一个地址需要更多的编程努力。在这一章,我们将会关注建立网络地址的传统问题,以及了解可以在这一领域帮助我们的函数。在这一章,我们了解到如下内容:网络地址分类IP网络掩码私有的以及保留的IP地址IP转换函数然而在我们开始之前,这是一个很好的机会来回顾一下IP地址的设计。这样我们就会更为理解我们将要进行的工作。网络IP地址IP地址是由四个十进制数组成的,其中由十进制的点来分隔,通常为点。每一个十进制值以网络字节顺序来表示一个字节的无符号值。在这里我们记住网络字节顺序
阅读全文
摘要:无名套接口套接口并不总是需要有一个地址。例如, socketpair函数创建了两个彼此相连的两个套接口,但是却没有地址。实际上,他们是无名套接口。想像一下冷战期间美国总统与苏联之间的红色电话。 他们任何一端并不需要电话号码,因为他们是直接相连的。同样,socketpair函数也是直接相连的,也并不需要地址。匿名调用有时在实际上,连接中的两个套接口中的一个也没有地址。对于要连接的远程套接口,他必须要有一个地址来标识。然而,本地套接口是匿名的。建立起来的连接具有一个有地址的远程套接口和另一个无地址的套接口。生成地址有 时我们并不会介意我们的本地址是什么,但是我们需要一个来进行通信。这对于需要连接到
阅读全文
摘要:创建套接口在这一部分,我们将会看到创建套接口与创建管道一样的容易。虽然有一些我们将会了解到的函数参数。为了能创建成功,这些参数必须提供合适的值。socketpair函数概要如下:#include <sys/types.h>#include <sys/socket.h>int socketpair(int domain, int type, int protocol, int sv[2]);sys/types.h文件需要用来定义一些C宏常量。sys/socket.h文件必须包含进来定义socketpair函数原型。socketpair函数需要四个参数。他们是:套接口的域套
阅读全文
摘要:理解套接口在我们试着使用套接口之前理解套接口后面的一些内容是很重要的。这一部分描绘出围绕着套接口的一些高级内容。定义套接口要与使用电话的某人进行交流,我们必须拿起话筒,拨打对方的电话号码,并且等待对方的应答。当我们与对方通话时,就建立了两个通信端点。我们的电话,在我们的位置远方的对方电话,在他的位置。只要我们仍在通话,就我们之间调用两个端点,建立了一条通信线路。Linux下的套接口也与电话相类似。套接口代表通信线路中的两个端点。在这两个端点之间存在着数据通信网络。在另一个方式上,套接口也与电话类似。当我们要打给某人,我们拨打我们要联系的人的电话号码。套接口有网络地址而不是电话号码。通过指定远程
阅读全文