Linux操作系统中BSD套接口开发基础介绍.docx
上传人:是你****松呀 上传时间:2024-09-15 格式:DOCX 页数:13 大小:16KB 金币:10 举报 版权申诉
预览加载中,请您耐心等待几秒...

Linux操作系统中BSD套接口开发基础介绍.docx

Linux操作系统中BSD套接口开发基础介绍.docx

预览

免费试读已结束,剩余 3 页请下载文档后查看

10 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

Linux操作系统中BSD套接口开发基础介绍Linux操作系统中BSD套接口开发基础介绍就像大多数Unix-based的操作系统一样,Linux支持将TCP/IP作为本地的网络传输协议。在这个系列中,我们假定你已经比较熟悉Linux上的C编程和Linux的一些系统知识诸如signals,forking等等。一、TCP/IP的基础介绍TCP/IP协议族允许两个运行在同一台电脑或者由网络连接在一起的两台电脑上的程序进行通讯。这个协议族是专门为了在不可靠的网络上进行通讯设计的。TCP/IP允许两个基本的操作模式——面向连接的可靠的传输(指TCP)和无连接的(connectionless)不可靠的传输(UDP)。TCP提供带有对上层协议透明的中继功能的,顺序的,可靠的,双向的(bi-directional),以连接为基础的字节传输流。TCP将你的信息分割成数据报(不大于64kb)并保证所有的数据报无误的按照顺序都到达目的地。由于以连接为基础,所以一个虚拟连接必须在一个网络实体(networkentity)和另一个之间进行通信前建立。UDP相反则提供一个(非常快的)无连接的不可靠消息传输(消息的大小是一个确定的最大长度)。为了使程序间可以相互通信,不论他们是在同一个机器(通过loopback接口)还是不同主机,每一个程序都必须有独立的地址。TCP/IP地址由两部分组成——用来辨别机器的IP地址和用来辨别在那台机器上的特定程序的端口地址。地址可以是点分(dotted-quad)符号形式的(如,127.0.0.1)或者是主机名形式的(如,www.csdn.net)。系统可以使用/etc/hosts或DNS域名服务(如果可以获得的话)进行主机名到点分符号地址(也就是IP地址)的转换。端口从1号开始编号。1和IPP0RT_RESERVED(在/usr/include/netinet/in.h中定义,通常为1024)之间的段口号保留给系统使用(也就是说,你必须以root的身份建立一个网络服务来绑定这部分的端口)。最简单的网络程序大都用的客户-服务器模型。一个服务进程等待一个客户进程连接他。当连接建立时,服务器代表客户执行特定的任务,通常这这以后连接就中断了。二、使用BSD套接口界面最通行的TCP/IP编程方法就是使用BSD套接口界面编程。通过它,网络端点(networkendpoints)(IP地址和端口地址)以套接口(sockets)的形式出现。这套套接口IPC(interprocesscommunication,进程间通讯)设施(从4.2BSD开始引入)的设计是为了能让网络程序的设计能够独立于不同的底层通信设施。1、建立一个服务器程序要使用BSD界面建立一个服务器程序,你必须通过以下步骤:(1)通过函数socket()建立一个套接口(2)通过函数bind()绑定一个地址(IP地址和端口地址)。这一步确定了服务器的位置,使客户端知道如何访问。(3)通过函数listem()监听(listen)端口的新的连接请求。(4)通过函数accept()接受新的连接。通常,维护代表了客户的请求可能需要花费相当长的一段时间。在处理一个请求时,接收和处理新的'请求也应该是高效的。达到这种目的的最通常的做法是让服务器通过fork()函数拷贝一份自己的进程来接受新的连接。以下的例子显示了服务器是如何用C实现的:/**Simple"Hello,World!"server*IvanGriffin(ivan.griffin@ul.ie)*//*HellwolfMistytranslated*/#include/**/#include/*exit()*/#include/*memset(),memcpy()*/#include/*uname()*/#include#include/*socket(),bind(),listen(),accept()*/#include#include#include#include/*fork(),write(),close()*//**constants*/constcharMESSAGE[]="Hello,World!n";constintBACK_LOG=5;/**程序需要一个命令行参数:需要绑定的端口号*/intmain(intargc,char*argv[]){intserverSocket=0,on=0,port=0,status=0,childPid=0;structhostent*hostPtr=NULL;charhostname[80]="";structsockaddr_inserverName={0};if(2!=argc){fprintf(stderr,