




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1Linux 组网技术与网络通信编程组网技术与网络通信编程计算机系99级研究生陈毅东2Linux 组网技术与网络通信编程组网技术与网络通信编程 Linux概述概述 Linux的安装的安装 Linux中中Internet服务的配置服务的配置 Linux编程环境简介编程环境简介 Linux上上Socket编程及实例编程及实例结束3Linux概述概述 Linux是什么是什么 Linux的发展历史的发展历史 Linux与与UNIX的关系的关系 Linux的版本号介绍的版本号介绍返回4Linux是什么是什么Linux是一个遵循POSIX标准的免费操作系统,具有BSD和System V的扩展特性。它版权所
2、有者是芬兰籍的Linus Benedict Torvalds先生和其他开发人员,并且遵循GPL声明。返回5Linux的发展历史的发展历史 1991年8月,来自芬兰赫尔辛基大学的年轻人Linus Benedict Torvalds,对外发表了一套全新的操作系统(Linux 0.01版)。 1991年10月5日,Linus发布了Linux的第一个“正式”版本,即0.02版。在Linux上可以运行bash,GCC。最早Linux被放置在一个FTP服务器上供大家自由下载,FTP管理员认为这是Linus的Minix,因而就建立了一个Linux目录来存放这些文件,于是Linux这个名字就传开了,现在已经成
3、为约定俗成的名称了。 1994年3月14日,Linux终于发布了它的第一个正式版本1.0版,而Linux的讨论区也从原来的comp.os.minix中独立成为alt.os.linux后来又更名为comp.os.Linux。返回6Linux与与UNIX的关系的关系 目前,UNIX有两个大流派:那就是AT&T发布的UNIX操作系统System V与美国加州大学伯克利分校发布的UNIX版BSD(Berkeley Software Distribution)。SVR4是两大流派融合后的产物。特性典型的SVRx典型的xBSD核心名称/unix/vmunix (Linux)终端启动文件/etc/i
4、nittab (Linux) /etc/ttys开机启动文件/etc/rc.d目录(Linux) /etc/rc.*文件挂上的FS/etc/mnttab/etc/mtab (Linux)常用的Shellsh , kshcsh程序对映/proc (SVR4和Linux)表1SVR系列和BSD系列的特性比较返回7Linux的版本号介绍的版本号介绍 内核版本指的是在Linus领导下的开发小组开发出的系统内核的版本号,例如:2.0.34和2.1.105等。(一般说来,以序号的第二位为偶数的版本表明这是一个可以使用的稳定版本,而序号的第二位奇数的版本一般有一些新的东西加入,是不一定很稳定的测试版本。)
5、一些组织或厂家将Linux系统内核与应用软件和文档包装起来,并提供一些安装界面和系统设定与管理工具,从而构成了一个发行套件。相对于内核版本,发行套件的版本号随发布者的不同而不同,与系统内核的版本号是相对独立的,例如Slackware 7.0,RedHat 7.0,TurboLinux 6.2,RedFlag 1.0等。返回8Linux的安装的安装 准备安装准备安装设置设置CMOS准备硬盘空间准备硬盘空间决定安装方式并制作相应软盘决定安装方式并制作相应软盘 安装中的一些注意事项安装中的一些注意事项硬盘的分区硬盘的分区配置配置TCP/IP安装安装LILO返回9设置设置CMOS 在CMOS中把Ant
6、i virus(防止病毒写主引导区)选项关闭。否则在安装LILO时会出现死机。 将PnP bios(即插即用)关闭,否则Linux可能不能正确检测用户的网卡、声卡和光驱的参数。 将启动顺序调整为(A,C);如果BIOS支持CDROM启动,而且手上的安装盘是可以引导的,则也可以选择启动顺序为(CDROM,C)。 关闭CMOS中的Memory Hole选项,否则不管用户内存有多大,Linux将只检测到16M内存。返回10准备硬盘空间准备硬盘空间 使用硬盘上有未分区的空间:为Linux建立一个分区(可在安装Linux时使用Linux的fdisk程序来完成)。 使用硬盘上有一个未使用的分区首先要删除现
7、在已不同的分区(可以用DOS的fdisk程序)然后再建立一个Linux分区(方法同1 )。 使用分区上未使用的空间整理原有硬盘上的数据(利用Windows的Defrag程序)改变原有硬盘分区的大小,得到未分配空间(可以使用PQMagic等工具)建立新的Linux分区(同1)返回11决定安装方式并制作相应软盘决定安装方式并制作相应软盘RedHat提供多种安装Linux的方法,较常用有:从光盘安装、从硬盘安装和通过NFS安装等。各种安装方式可能要求不同的启动盘和补充盘。例如:从光盘安装只需要一张启动盘(如果机器能支持光盘启动且手头的安装盘是可以引导的,则甚至不需要制作这张盘);从硬盘安装需要有一张
8、启动盘和一张补充盘;通过NFS安装则需要有一张网络启动盘。在DOS上制作上述各种软盘使用的是RedHat Linux安装盘dosutils目录下的rawrite.exe程序。相应磁盘映像则在该安装盘的images目录中。返回12硬盘的分区硬盘的分区Linux分区的个数分区的个数 安装Linux至少需要两种硬盘分区:一个或多个“Linux native”类型的分区和一个“Linux swap”类型的分区。以下是一些推荐的配置:一个交换分区一个根分区一个/usr分区一个/home分区一个/usr/local分区一个/usr/src分区一个/tmp分区一个/var分区13硬盘的分区硬盘的分区Linu
9、x分区命名规则分区命名规则 Linux通过字母和数字的组合来标识硬盘分区:前两个字母:表明分区所在设备的类型。通常hd指IDE硬盘,sd指SCSI硬盘。第三个字母:表明分区所处的设备。例如,/dev/hda指第一个IDE主盘;/dev/sdb指第二个SCSI硬盘。数字:代表分区。前四个分区(主分区或扩展分区)用数字1到4表示,逻辑分区从5开始。例如,/dev/hda3指第一个IDE主盘上的第三个主分区或扩展分区;/dev/sdb6则指第二个SCSI硬盘上的第二个逻辑分区。14硬盘的分区硬盘的分区fdisk命令概述命令概述fdisk包含有一个简单而有用的在线帮助,下面是一些最常用的命令:m:打印
10、出命令列表。p:列出当前的分区情况。n:增加一个分区。l:列出各种分区类型及其对应的值。t:改变一个分区的类型。w:存盘并退出。q:不存盘而退出。返回15配置TCP/IP选择网络配置方式16配置TCP/IP设置网关与本地IP17配置TCP/IP设置域名与主机名返回18安装LILO什么是LILOLILO是the LInux LOader的简写,顾名思义是用来引导Linux的。事实上,LILO还是一个优秀的启动管理器。LILO可以安装在两个地方,即主启动记录(MBR)或Linux根分区的第一个扇区。若将LILO装在MBR,当机器启动时,LILO将显示一个boot:提示,然后,我们就可以启动Linu
11、x或由LILO配置的其他操作系统。若原先已经安装了其他启动管理器(如:System Commander),则应把LILO装在Linux根分区的第一个扇区。这时,我们应设置相应的启动管理器来启动LILO,进而启动Linux。19安装LILO选择安装方式20安装LILO设置LILO选项21安装LILO选择可启动分区返回22Linux中中Internet服务的配置服务的配置 TCP/IP网络的配置网络的配置 安装配置安装配置WWW服务器服务器 设置匿名设置匿名FTP服务器服务器 BBS服务器的安装说明服务器的安装说明返回23TCP/IP网络的配置网络的配置三个命令三个命令 ifconfig命令格式:
12、ifconfig interface options例子:ifconfig eth0 02 broadcast 55 netmask route命令格式:route add|del -net|-host destination gw gateway metric metric options例子:route add -net gw 02route add default gw 53route add -host gw host
13、name命令格式:hostname hostname例子:hostname 24TCP/IP网络的配置网络的配置两个文件两个文件 /etc/hosts文件说明:包含一个IP地址和对应的节点名的列表。例子:mtg /etc/resolv.conf文件说明:设置名字服务器的地址和本网络的DNS域名例子:nameserver4返回25安装配置安装配置WWW服务器服务器准备准备 从光盘上或有关的ftp站点获取Apache HTTP服务 器 的 源 程 序 包 , 其 文 件 名 可 能 是apache_1.3.0.tar.gz。 在安装目录/usr/local/etc下,使用命令行
14、“tar zxvf apache_1.3.0.tar.gz” 把取得的源程序包打开,生成apache_1.3.0目录。 用命令行“ln -s apache_1.3.0 httpd”建立一个名为httpd的符号连接。 26安装配置安装配置WWW服务器服务器安装安装 将apache_1.3.0/src目录下的Configuration.tmpl文件拷贝成Configuration,并对它进行编辑。该文件中包含对一些“Rule”和“Module”的设置。Apache的设计使用可加载模块的方式,我们若希望加入某模块,就将该文件中相应行前的“”去掉。 运行Configure脚本文件,生成Makefile
15、文件。 运行make程序,编译Apache HTTP服务器。如果一切顺利的话,则apache_1.3.0/src目录下将生成可执行文件httpd。 27安装配置安装配置WWW服务器服务器配置配置 修改Apache HTTP配置文件apache_1.3.0/conf目录中有三个的配置文件模版:srm.conf-dist、access.conf-dist和httpd.conf-dist,先将它们分别拷贝成srm.conf、access.conf和httpd.conf,再对它们进行相应的修改。http.conf文件:用来配置服务器的基本参数。我们可能需要改动其中的Group,ServerAdmin和
16、ServerName。 srm.conf文件设置文件树的根目录及一些特殊功能,我们应定义几个目录别名,去掉该文件中如下的两行前的“”:Alias /icons/ /usr/local/etc/httpd/icons/ScriptAlias /cgi-bin/ /usr/local/etc/httpd/cgi-bin/ 设置系统启动方式 httpd可有两种启动方式:inetd和standalone,可以通过设置http.conf文件中的ServerType参数来实现。返回28设置匿名设置匿名FTP服务器服务器建立帐号建立帐号在系统中建立一个新的用户ftp和一个新的用户组ftp。为了安全,用户和G
17、ID应该是远离其它UID和GID的值,例如30000。ftp用户应该属于ftp组,而且ftp组除了ftp外应不含其他用户。ftp用户的shell应该是一个不存在的shell或干脆放空。这样在建立了相应用户后,/etc/passwd文件应该包含如下的行: :而/etc/group文件中则有如下行:ftp:*:30000:ftp为管理的方便和安全,我们还可建立一个FTP管理员帐号,如。对FTP服务器中向外发布文件的管理应使用这个帐号完成。29设置匿名设置匿名FTP服务器服务器创建目录创建目录匿名FTP服务器中通常应有如下目录(主目录/home/ftp用表示): /:这个目录的属主应该是root,并
18、且是任何人不可写的(0555)。 /bin:其属主应该是root,并且是任何人不可写的(0111)。其中文件的保护应该是0111。 /lib:这个目录的属主应该是root,并且是任何人不可写的(0111)。其中文件的保护应该是0555。 /etc:拷贝/etc/passwd和/etc/group文件到这个目录下,并从中删除除ftp用户和组以外的其它用户和组信息。这两个文件应该是可读的(0444)。/pub:这个目录的属主和组应是FTP管理员()的属主和组,其保护应该是0755。 /incoming:这个目录的属主和组应是ftp,保护可以是0755或0775。30设置匿名设置匿名FTP服务器服务
19、器配置文件配置文件 /etc/:定义文件的“飞行”转换规则。即文件或目录在使用RETRIEVE命令传递过程中进行压缩(解压缩)和打包的规则。这个文件一般可以拷贝自ftp系统的范例文件。 /etc/:本地用户若其用户名出现在本文件中,将不被允许使用此FTP服务器,我们应将root及其他系统帐号(如:bin、sys)加入到本文件中。 /etc/:本文件中设置允许或拒绝某些特定节点(或域)以匿名登录。例如:allow5deny.*31设置匿名设置匿名FTP服务器服务器/etc/:FTP服务器的主要配置文件。# 定义用户类别Classallreal,guest,anonymous
20、*# 定义尝试登录次数loginfails 5# 定义用户使用命令的权限compressyesalltaryesallchmodnoguest,anonymousdeletenoguest,anonymousoverwritenoguest,anonymousrenamenoguest,anonymous# 配置上转文件夹upload/home/ yes 0644 dirs返回32BBS服务器的安装服务器的安装建立帐号建立帐号 在/etc/passwd文件中添加如下三行:bbsroot:9990:99:BBS adm:/home/bbsroot:/bin/cshbbs:9999:99:BBS
21、user:/home/bbs:/home/bbs/bin/bbsrfbbsuser:9999:99:BBS user:/home/bbs:/bin/csh 在/etc/group内应该设定bbs的group:bbs:*:99:bbs,bbsuser,bbsroot 在/etc/shells中加入/home/bbs/bin/bbsrf。 在/home下建立bbsroot和bbs两目录,执行如下命令: ( chown bbsroot.bbs bbsroot ; chown bbs.bbs bbs ) 分别替bbsroot和bbsuser设定密码。 33BBS服务器的安装服务器的安装解压与安装解压与
22、安装 以bbsroot身份登录系统,用tar命令将所得的BBS软件包解压。生成bbs_src目录。 以bbsroot登录系统,到bbs_src/目录下执行:( cd CONFIG ; ./configure )。按要求填写相应的BBS信息。编辑得到的Makefile文件,将其中INSTALL=/install -c一行中的/install改为系统install程序的路径。 在bbs_src/下执行make命令,顺利的话,bbs_src/目录下应已产生了bbs,bbsrf,chatd及thread四个文件。 以root登录系统,在/home/bbsroot/bbs_src目录下执行:make i
23、nstallmake installchatdmake installthread返回34Linux编程环境简介编程环境简介 使用编程工具使用编程工具编辑工具编辑工具gcc简介简介 常用的系统调用常用的系统调用返回35编辑工具编辑工具Vi的使用的使用Vi有三种工作方式:正文插入方式、命令方式和ex转换方式。下面介绍最常用的命令::w若正文已经被修改,则将正文存盘:q退出Vi编辑程序(不存盘):q!强行退出Vi编辑程序:x存盘并退出:!sh进入子shell,用ctrl-d返回:set number显示行号:set nonumber隐藏行号h(),l(),k(),j()移动光标i在光标所在的字符之
24、前插入正文a在光标所在的字符之后插入正文dd删除当前行x删除光标所在的字符/string向前搜索字符string36编辑工具编辑工具Emacs简介简介Emacs(Editor MACroS)和vi不同,没有编辑状态和命令状态之分,其最重要的概念是其独特的缓冲区,Emacs编辑的所有文件都是放在缓冲区中的,Emacs支持同时编辑多个缓冲区,它可以将一个文件在多个缓冲区中打开不同的拷贝。一般所有的缓冲区在硬盘上都有一个以“”开头的备份文件,这样在系统突然崩溃的时候可以即时将用户的工作进行备份。在Emacs中,我们可以对多种程序语言(C,C+,Perl,Lisp等)的程序进行编译,调试等。Emac为
25、我们提供菜单界面。下面是几个常用菜单项的热键(其中,C-表示Ctrl+):Open Files:C-x C-fOpen Directory:C-x C-dSave Buffer:C-x C-sSave Buffer As:C-x C-wExit Emacs:C-x C-c取得帮助:C-h返回37gcc简介GNU的C编译器是gcc,是编程人员最常用的编译工具。它在编译C程序生成可执行文件看起来像是一步完成的,但是事实上,它要经历四个步骤:预处理、编译、汇编和连接。gcc的使用颇为复杂,选项有上百个之多,其基本用法为:$ gcc -o prog main.c subr1.c subr2.c sub
26、r3.c这条命令行将main.c、subr1.c、subr2.c、subr3.c编译连接成可执行文件prog。若省略-o选项则gcc使用缺省的可执行文件名a.out。返回38常用的系统调常用的系统调fork()功能:创建一个新的进程.语法:#include #include pid_t fork ();返回值:成功则子进程返回0,父进程返回子进程号。失败返回-1。例子:pid_t pid;if (pid=fork ()0) printf (“Im parentn”); else if (pid=0) printf (“Im childn”); else printf (“fork errorn
27、”); 39常用的系统调常用的系统调exec()功能:执行一个文件语法:#include int execl(char *path,char *arg0,.,(char *)0);int execv(char *path,char *argv);int execle(char *path,char *arg0,(char *)0,char *envp);int execve(char *path,char *argv,char *envp);int execl(char * *arg0,.,(char *)0);int execvp(char * *argv);返回值:失败时返回-1。例子:e
28、xecl (“/bin/ps” , “ps” , “-ef” , (char *)0);printf (“fork errorn”);exit (-1);40常用的系统调常用的系统调wait()和和waitpid()功能:等待一个子进程返回并修改状态语法:#include #include pid_t wait (int *stat_loc);pid_t waitpid (pid_t pid , int *stat_loc , int options);返回值:等待到一个子进程返回时,返回该子进程号,否则返回-1。同时stat_loc存放子进程的返回值。41常用的系统调常用的系统调exit()
29、功能:终止进程.语法:#include void exit (int status);说明:调用进程被该系统调用终止。返回值:无例子:if (fork ()0) wait (int *)0); /*父进程等子进程*/else /*子进程处理过程*/exit (0); 返回42Linux上上Socket编程及实例编程及实例 Berkeley套接字概述套接字概述 套接字基础知识套接字基础知识 基本套接字基本套接字基本套接字系统调用基本套接字系统调用客户服务器模式客户服务器模式 DNS的操作的操作 五种五种I/O模式模式 使用使用Inetd 返回43Berkeley套接字概述套接字概述套接字历史套接
30、字历史在80年代早期,远景研究规划局资助了加利福尼亚大学伯克利分校的一个研究组,让他们将TCP/IP软件移植到UNIX操作系统中。作为项目的一部分,设计者们创建了一个接口,应用进程使用这个接口可以方便地进行通信。于是就出现了插口接口(Berkeley套接口)。它首先出现在BSD 4.1中。由于许多计算机厂商都采用了Berkeley UNIX,于是许多机器上都可以使用套接字。这样,套接字就被广泛使用,到现在已经成为事实上的标准。 44Berkeley套接字概述套接字概述何谓套接字何谓套接字套接字(Socket)英文原意是“插座”,作为BSD UNIX的进程通信机制,它实质上提供了进程通信的端点。
31、每个套接字都包含三个值:协议、本地地址和本地端口号。套接字有本地唯一的套接字号,是一个整型数。事实上它是一个文件描述符。45Berkeley套接字概述套接字概述套接字类型套接字类型 流式套接字(SOCK_STREAM):提供可靠的、面向连接的通信流,通过它发送的数据保证原有顺序不变。它使用的是TCP协议。 数据报套接字(SOCK_DGRAM):定义了一种无连接的服务,数据通过相互独立的报文进行传输,是无序的,并且不保证可靠、无差错。它使用的是UDP协议。 原始套接字(SOCK_RAW) :允许对底层的协议直接访问,主要用于新的网络协议的开发。它功能强大,但没有上面两种套接字方便。 返回46套接
32、字基础知识套接字基础知识IPv4套接字地址结构套接字地址结构IPv4套接字地址结构在netinet/in.h文件中定义:struct in_addr in_addr_ts_addr;/32位IPv4地址;/网络字节顺序struct sockaddr_inuint8_tsin_len;/结构的长度(=16)sa_family_tsin_family;/AF_INETin_port_tsin_port;/16端口号/网络字节顺序struct in_addr sin_addr;charsin_zero8;/无用;47套接字基础知识套接字基础知识IPv6套接字地址结构套接字地址结构IPv6套接字地址结
33、构在netinet/in.h文件中定义:struct in6_addr uint8_ts6_addr16;/128位IPv6地址;/网络字节顺序struct sockaddr_in6uint8_tsin6_len;/结构的长度(=24)sa_family_tsin6_family;/AF_INET6in_port_tsin6_port;/16位端口号/网络字节顺序uint32_tsin6_flowinfo;/优先级和流标记/网络字节顺序struct in6_addrsin6_addr;48套接字基础知识套接字基础知识一般套接字地址结构一般套接字地址结构 一般的套接字地址结构在sys/socke
34、t.h文件中定义:struct sockaddruint8_tsa_len;/结构的长度(=16)sa_family_tsa_family;/地址族:AF_xxxcharsa_data14;/协议特殊的地址;套接字函数地址参数被定义成取得一般的套接字地址结构,例如下面的函数:int bind (int , struct sockaddr *, socklen_t)对它的调用应是如下:struct sockaddr_in serv;bind (sockfd , (struct sockaddr *) &serv , sizeof (serv);49套接字基础知识套接字基础知识字节顺序转换
35、字节顺序转换(1) 主机字节顺序和网络字节顺序:不同的机器,内部对变量的字节存储顺序不同。有的系统是高位在前,低位在后;有的系统则是低位在前,高位在后。这种由特定系统定义的顺序我们称为主机字节顺序。网络协议要求在网络传输的数据具有统一的顺序,我们称为网络字节顺序。 50套接字基础知识套接字基础知识字节顺序转换字节顺序转换(2) 有关的转换函数:#include uint16_t htons (uint16_t host16bitvalue);uint32_t htonl (uint32_t host32bitvalue);uint16_t ntohs (uint16_t net16bitval
36、ue);uint32_t ntohl (uint32_t net32bitvalue);51套接字基础知识套接字基础知识IP地址转换地址转换(1)#include int inet_aton (const char * strptr , struct in_addr *addrptr);/将C字符串转换成地址值。成功返回1,否则返回0。in_addr_t inet_addr (const char * strptr);/将C字符串转换成地址值。成功返回该值,否则返回INADDR_NONE。char *inet_ntoa (struct in_addr inaddr);/将32位二进制网络字节顺
37、序IPv4地址转换成对应的带小数点的十进制数字串。返回值将是该字符串。int inet_pton (int family , const char * strptr , void *addrptr);/将C字符串转换成地址值,成功返回1,字符串格式不合法返回0,错误返回-1。const char *inet_ntop (int family , const void * addrptr , char *strptr , size_t len);/执行与inet_pton相反的功能。失败返回NULL。52套接字基础知识套接字基础知识IP地址转换地址转换(2)关于inet_ntoa的一个例子:ch
38、ar *a1,*a2;struct in_addr inaddr1,inaddr2;inaddr1.s_addr=htonl (0 xD2220601);inaddr2.s_addr=htonl (0 xD2220666);a1=inet_ntoa (inaddr1);a2=inet_ntoa (inaddr2);printf (“address 1: %s n”,a1);printf (“address 2: %s n”,a2);上面程序的返回值是:address 1: 02address 2: 0253套接字基础知识套接字基础知识字节处理函数字节处理
39、函数#include void bzero (void *dest , size_t nbytes);/将目标中特定数目的字节置0。void bcopy (const void *src , void *dest , size_t nbytes);/从源中拷贝特定数目的字节到目标中。int bcmp (const void *ptr1 , const void *ptr2 ,size_t nbytes);/比较两个任意字符串。相同返回0,否则返回非零。void memset (void *dest , int c , size_t len);/将目标中特定数目的字节置为值c。void *mem
40、cpy (void *dest , const void *src , size_t nbytes);/从源中拷贝特定数目的字节到目标中。int memcmp (const void *ptr1 ,const void *ptr2 , size_t nbytes);/比较两个任意字符串。相同返回0,否则返回非零。返回54socket ()bind ()listen ()accept ()read ()或recv ()write ()或send ()read ()或recv ()close ()阻塞直到客户连接建立连接TCP三次握手数据(要求)数据(应答)文件结束标志TCP Serversock
41、et ()connect ()write ()或send ()read ()或recv ()close ()TCP Client面向连接套接字的工作流程面向连接套接字的工作流程55socket ()bind ()recvfrom ()sendto ()close ()阻塞直到客户连接数据(要求)数据(应答)UDP ServerTCP Clientsocket ()sendto ()recvfrom ()无连接套接字的工作流程无连接套接字的工作流程返回56基本套接字系统调用基本套接字系统调用socket ()功能:取得套接字描述符。语法:# include int socket (int fam
42、ily , int type , int protocol);返回值:成功时返回非负描述符,失败时返回-1。说明:family参数指定套接字的协议族(IPv4为AF_INET、IPv6为AF_INET6);type参数指定套接字的类型(SOCK_STREAM、SOCK_DGRAM或SOCK_RAW)。除非使用原始套接字,否则protocol参数应设为0。返回57基本套接字系统调用基本套接字系统调用bind ()功能:指定一定的协议地址到某套接字。语法:# include # include int bind (int sockfd , const struct sockaddr *myaddr
43、 , socklen_t addrlen);返回值:成功时返回0,失败时返回-1。说明:通过指定端口号为0,让bind选择一个端口号。通过如下方法可指定自动获取IP地址时:struct sockaddr_in serv4; /IPv4serv4.sin_addr.s_addr=htonl (INADDR_ANY);struct sockaddr_in6 serv6; /IPv6serv6.sin6_addr=in6addr_any;相关函数:getsockname ()、setsockopt ()返回58基本套接字系统调用基本套接字系统调用getsockname ()语法:# include
44、# include int getsockname (int sockfd,struct sockaddr *localaddr,socklen_t *addrlen);返回值:成功时返回0,失败时返回-1。说明:可能需要使用本函数的情况主要有三个,即成功地连接之后、用端口号0调用bind函数、在调用bind时指定自动获取IP地址。返回59基本套接字系统调用基本套接字系统调用setsockopt ()功能:取得和设置套接字选项。语法:# include # include int setsockopt (int sockfd,int level,int optname,const void *
45、optval,socklen_t optlen);返回值:成功时返回0,失败时返回-1。说 明 : 第 二 个 参 数 指 定 系 统 中 解 释 选 项 的 代 码(SOL_SOCKET:一般,IPPROTO_IP:IPv4等)。缺省情况下,一个套接字终止后不能用同一端口重启。为解决这个问题,服务器程序中在socket和bind之间通常应该用setsockopt函数设置选项SO_REUSEADDR:int opt=1;setsockopt (sockfd,SOL_SOCKET,SO_REUSEADDR,&opt , sizeof (opt);返回60基本套接字系统调用基本套接字系统调
46、用listen ()功能:进行系统侦听,等待客户连接。语法:# include int listen (int sockfd , int backlog);返回值:成功时返回0,失败时返回-1。说明:当一个套接字被创建时,在缺省的情况下,它是一个主动的套接字,也就是一个将调用connect的客户套接字。这个函数的作用就是将一个尚未连接的套接字转换为一个被动的套接字,也就是内核将接收外来的针对这个套接字的连接请求。第二个参数是指定了未经处理的连接请求队列可以容纳的最大数目,推荐值应该是5到10。 返回61基本套接字系统调用基本套接字系统调用accept ()功能:完成一个连接。语法:# incl
47、ude # include int accept (int sockfd, struct sockaddr *cliaddr,socklen_t *addrlen);返回值:成功时返回非负描述符,失败时返回-1。说明:当本函数被调用时,TCP服务器将从等待队列的前面返回下一个连接。如果该队列为空则在阻塞套接字的情况下服务器进程将转入阻塞状态。函数成功返回后将返回一个新的套接字描述符,用来表示这个连接。远程主机的信息将由参数cliaddr返回,而该地址结构的大小将由addrlen返回。相关函数:getpeername ()返回62基本套接字系统调用基本套接字系统调用getpeername ()功
48、能:返回与一个套接字相关的远程协议地址。语法:# include # include int getpeername (int sockfd,struct sockaddr *peeraddr,socklen_t *addrlen);返回值:成功时返回0,失败时返回-1。说明:通常服务器在调用了accept完成一个连接后就可以获得远程主机的有关信息。但有一种特殊的情况,即服务器本身不调用accept,它是被调用accept的进程用exec启动的。这时,服务器进程若需要知道远程主机的信息就必须调用本函数。返回63基本套接字系统调用基本套接字系统调用connect ()功能:和指定服务器建立连接。
49、语法:# include # include int connect (int sockfd,const struct sockaddr *servaddr,socklen_t addrlen);返回值:成功时返回0,失败时返回-1。说明:sockfd是一个由socket函数返回的套接字描述符。第二和第三个参数分别是指向一个套接字的指针和其大小。在调用本函数之前,我们并不需要调用bind函数,内核将为我们选择一个端口号和IP地址。本函数不仅可以用来进行TCP连接,而且可以用在UDP中。当对一个UDP套接字使用本函数时,内核仅记录对方的IP地址和端口号,然后直接返回到调用进程。返回64基本套接字
50、系统调用基本套接字系统调用write ()功能:向一个套接字发送一定字节的数据。语法:# include # include ssize_t write (int sockfd, const void *buff,size_t nbytes);返回值:返回已成功发送字节数,失败返回-1。65基本套接字系统调用基本套接字系统调用read ()功能:从一个套接字接收一定字节的数据。语法:# include # include ssize_t read (int sockfd , void *buff , size_t nbytes);返回值:返回读到字节数,读到EOF时返回0,失败返回-1。说明:
51、在流式套接字中也使用read和write函数,但其行为和在通常文件I/O时不同。在这里,一个read或write可能发送或接收比所要求量小的数据,但这却不是一个错误。原因是这个调用可能已经到达了套接字在内核中的缓冲区限制。这时只需再次调用read或write就可以了。这种现象在我们调用read时经常发生,而仅当我们的套接字是非阻塞的(见后)时,才会出现在write调用中。66基本套接字系统调用基本套接字系统调用send ()功能:向一个套接字发送一定字节的数据。语法:# include # include ssize_t send (int sockfd, const void *buff,s
52、ize_t nbytes, int flags);返回值:返回已成功发送字节数,失败返回-1。67基本套接字系统调用基本套接字系统调用recv ()功能:从一个套接字接收一定字节的数据。语法:# include # include ssize_t recv (int sockfd, void *buff, size_t nbytes,int flags);返回值:返回读到字节数,失败返回-1。说明:recv和send函数和标准的read和write函数很类似。唯一的差别就在于其调用的第四个参数。recv和send函数的第四个参数是一个整型的标志位。我们可以以位或的形式包含系统允许的一系列标志,
53、从而设置在这一次I/O的特性。通常情况下这个参数都被置为0,实现普通read和write的功能。返回68基本套接字系统调用基本套接字系统调用close ()功能:关闭套接字描述符。语法:# include int close (int sockfd);返回值:成功时返回0,失败时返回-1。说明:调用本函数后,参数所描述的套接字将被标记成关闭的。从此该套接字对于对应进程将是不可用的。返回69基本套接字系统调用基本套接字系统调用sendto ()功能:发送一定字节数的UDP数据报。语法:# include # include ssize_t sendto (int sockfd, const vo
54、id *buff,size_t nbytes , int flags ,const struct sockaddr *to,socklen_t addrlen);返回值:返回已成功发送字节数,失败返回-1。70基本套接字系统调用基本套接字系统调用recvfrom ()功能:接收一定字节数的UDP数据报。语法:# include # include ssize_t recvfrom (int sockfd, void *buff,size_t nbytes, int flags,struct sockaddr *from,socklen_t *addrlen);返回值:返回读到字节数,失败返回-
55、1。说明:recvfrom和sendto参数主要是用在未连接的UDP套接字中的,其前面四个参数和recv及send相同,参数to和from分别指定所接收数据报的源地址和所发送数据报的目标地址。参数addrlen则指定地址结构的大小。返回71客户服务器模式客户服务器模式服务器可以分成两类:重复型或并发型: 重复型服务器的流程:i1、等待一个客户请求的到来。i2、处理客户请求。i3、发送响应给发送请求的客户。i4、返回i1。并发型服务器的流程:c1、等待一个客户请求的到来。c2、启动一个新服务器进程处理客户请求,处理完毕并发送回应后该新进程终止。c3、返回c1。一般说来,TCP服务器是并发的,而U
56、DP服务器是重复的。返回72DNS的操作的操作DNS简介简介到目前为止,我们仍使用数字地址和数值端口号,在编写实际程序时我们应该使用名字。使用名字有诸多好处:名字容易记忆,数字地址可能变更而名字却不常改变,转到IPv6后其地址的长度也要求我们使用名字。DNS是(Domain Name System,域名系统)主要就是用来在主机和IP地址之间进行映射的。这里的主机名可以是简单名或FQDN(fully qualified domain name,完全限定的域名)。我们在程序中可以使用一些函数查询名字服务器,达到在名字和地址之间进行转换的目的。73DNS的操作的操作gethostbyname ()功能:查找主机名返回IP地址。语法:# include struct hostent *gethostbyname (const char *hostname
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 计算机输入输出2025年考试试题及答案
- 2025年软考备考的高效秘笈试题及答案
- 生活习惯养成小班教育计划要点
- 现代化开发流程的优化策略试题及答案
- 2025年软考服务导向架构试题及答案
- 仓库应对市场变化的灵活策略计划
- 云计算平台的服务模型解析试题及答案
- 河北省石家庄市八校联考2025年七下数学期末经典模拟试题含解析
- 保密资质认定管理办法
- 2025届合肥蜀山区五校联考八年级数学第二学期期末考试模拟试题含解析
- 《匹配理论》课件
- 《威尼斯商人》课本剧剧本:一场人性与金钱的较量(6篇)
- 建筑安全管理人员应知应会
- 医疗毒麻药品培训
- GB/T 21477-2024船舶与海上技术非金属软管组件和非金属补偿器的耐火性能试验方法
- 医疗器械经营监督管理办法培训2024
- 2024年公路水运工程试验检测师《道路工程》考试题库大全(含真题等)-中(多选题)
- 中医医术确有专长人员医师资格考核申报资料表
- DB41T 2213-2021 水文自动监测设备维护规程
- 幕墙专业培训资料
- 电网的电流保护课程设计
评论
0/150
提交评论