Unix操作系统实验报告

Unix操作系统实验报告

计算机科学与技术学院

实验一、Linux基本命令

一.实验目的

掌握linux平台下的基本命令(40个)

二.实验说明

在介绍所有的命令之前,先介绍一下Linux的在线帮助man。在Linux下,当你要查找一个命令的用法的,你可以通过 man 命令名 来源得命令的详细说明。因为每个Linux都有一份man文档,所以介绍命令的时候我们只是简直介绍一下命令的学用选项。如果想查看命令的详细说明,请自己看man。下面是man各小节的内容:
   1   用户命令。
   2   系统调用。
   3   库函数。
   4   特殊文件(设备和网络接口)。
   5   文件格式。
   6   游戏和演示。
   7   系统环境、表格和宏。
   8   系统管理和相关命令。

三.命令说明

1. apropos    依据所给关键字查找相关的命令和系统调用

格式:apropos keyword

例:查找与ftp相关的命令和系统调用

$apropos ftp

注:类似的命令有man -k。man -k 其实就是执行apropos

2.  at    在某一特定时间执行指定的命令

格式:at [-V][-q 队列][-f 文件][-m] time

选项说明:

-V     显示标准的错误输出。

-f     可将作业存在一个文件中,用这个选项指定文件。例如一个shell文件。

-q     指定队列名称,默认为c。

-m     执行后给用户发邮件。

time 指定开始执行的时间。时间格式为: HHMM,日期格式:MM/DD/YYMM.DD.YYMMDDYY。 下面的例子演示了在20##年3月11日21点34分执行一个at命令。

$at 21:34 03/11/04

执行这条命令后会得到一条warning:

commands will be executed using (in order) a)$SHELL b) login shell c)/bin/sh然后就出现“at>”的提示符。这时你就可以输入你要执行的命令了,结束后按Ctrl+d。你就可以去喝茶了,到时间后系统会自动执行它。

相关配置文件:

/etc/at.allow 如果这个文件存在,仅允许这个文件里列出的用户使用at。

/etc/at.deny 如果这个文件存在,该文件列出的用户都不能使用at服务。当 这个文件为空时,任何用户都可以使用at,这是默认配置。

当运行at命令时,先检查/etc/at.allow文件是否存在,如果不存在,再检查 /etc/at.deny文件是否存在。不管这两个文件是不是存在,root用户都可以执行at命令。

相关命令:

atq列出用户待执行的任务,除了root用户的外,每个用户的任务都将被列出。

atrm通过任务号删除at任务。

batch当系统负载允许的时候执行命令。比如当负载低于0.8或者一个指定的值时,指行atrun。

3.  cat    查看文件内容,从键盘读取数据,合并文件等

格式:cat [-b][-A][-E][-T][-n][-s][-v] 文件名

选项说明:

-b     不显示文件中的空行。

-A     相当于 -v -E -T (-vET)。

-E     在文件的每一行行尾加上“$”字符。

-T     将文件中的Tab键用字符“^I”来显示。

-n     在文件的每行前面显示行号。

-s     将连续的多个空行用一个空行来显示。

-v     显示除Tab和Enter之外的所有字符。

下面的命令演示了如何显示file文件中的行号

$cat -n file

4.  chmod    修改文件权限

格式:chmod 选项 文件或目录名

选项说明:

u     文件所有者

g     文件所属组

o     其它用户

+     增加权限

-     取消权限

=     赋给权限

a     所有用户

r     读权限

w     写权限

x     执行权限

下面的命令演示了如何使所有用户都可以读写file文件

$chmod a+rw file

5.  chown    改变文件所有者

格式:chown [-R][-c][用户名][组名] 文件或目录名

选项说明:

-c     文件属主改变时显示说明。

-R/r    改变目录下的文件及其子目录下所有文件的属主。

下面的命令演示了如何改变 dir 目录下的文件及其子目录下的文件的属主为bugboy

$chown -R bugboy dir

6.  cp    复制文件

格式:cp 选项 源文件名 目标文件名

选项说明:

-R     复制整个目录。

-f     删除己存在的目标文件。

-i     使用-f遇到删除文件时给出提示。

下面的命令演示了如何把 file 文件复制到当前用户的根目录下

$cp  file  ~/

7.  crontab     制定计划任务

crontab通过cron服务使用户能够在指定的时间执行某些程序,它通过cron复制,创建列出,删除crontab文件来管理用户权限和计划。

命令格式:crontab [-u username] [-l] [-e] [-r]

选项说明:

-e     编辑当前用户的crontab文件,或者当一个crontab文件不存在时,创建一个crontab 文件。编辑并保存后文件被当前用户的crontab安装。

-l     列出当前crontab文件内容。

-r     删除当前用户的crontab文件。

-u username     指定用户名。

crontab文件格式:

crontab文件有六个域,每个域之间用空格或者Tab键分开,前五个域都是整数或者*,格式如下(括号里面是取值范围):

    分钟(0-59)  小时(0-23)  日(1-31)  月(1-12)  星期(0-6)  要执行的命令

其中星期取值0指星期日,其它取值递推。前面五个域,每个域都可以用*表示所有合法的值,或者用一个列表列出合法的值,各值之间用“,”隔开,也可以用“-”表示一个范围。下面的命令演示每个星期,星期日到星期四晚上23:30分关机。

    30  23  *  *  0-4  halt -p

下面的例子示出每星期星期一到星期五3:15分清除用户目录下的core文件

    15  3   *  * 1-5  find $HOME -name core 2>/dev/null |xargs rm -f

下面是一个crontab文件的例子,请用crontab -e 命令编辑。

SHELL=/bin/bash

PATH=/usr/bin:/bin:/usr/sbin:/sbin

MAILTO=bugboy

HOME=/home/bugboy

30 23 * * 0-4 halt -p

前面四行定义环境变量,最后一行是执行的命令,你可以定义要执行多个命令。如果你的crontab文件已经正确编辑,保存退出后会得到一条"crontab:installing new crontab" 的信息。

相关文件:

/etc/cron.d/cron.allow     如果这个文件存在,文件中包含的用户名可以使用crontab。

/etc/cron.d/cron.deny     如果这个文件存在,文件中包含的用户不能使用crontab。

你可以自己编辑这两个文件,注意每个用户名占一行。

8.  df    查看磁盘剩余空间

格式:df [-t][-x][-k][-p][-a][-m][filename]

选项说明:

-t     只输出类型列在fstype中的文件系统。

-x     只输出类型没有列在fstype中的文件系统。

-k     显示空间以K为单位。

-m     显示空间以M为单位。

-a     将空间为0的文件系统也输出。

filename     指定要查看的文件的大小。

9.  fdisk/sfdisk   查看硬盘分区信息

10.     格式:fdisk -l [-u] [device ...]

11.           fdisk -s partition

选项说明:

-u   列出分区表的时候以扇区的大小代替柱面大小。

-l   列出给定设备的分区表,如果没有给定设备,则列出/proc/partions中设备的分区表。

-s partition   给出partition分区的大小(以块为单位)。

12.            file    识别文件类型

格式:file 文件名

13.            find    查找文件

格式:find [路径][匹配表达示]

其中匹配表达示有几种类型:

-name filename     查找指定名称的文件。

-user username     查找指定用户名的文件。

-group grpname     查找指定级名的文件。

-print     显示查找的结果。

-size n     查找大小为n块的文件,一块等于512字节。符号“+n”表示查找大小大于n块的文件;符号“nc”表示查找大小为n个字符的文件,同样的也有符号“+nc”。

-inum n     查找索引结点号(i-node)为n的文件。

-atime n    查找n天前被访问的文件。“+n”表示超过n天前被访问的文件;“-n”表示不超过n天前被访问的文件。

-mtime n    类似于atime,但是检查的是文件内容被修改的时间。

-ctime n   类似于atime,但检查的是文件索引结点被改变的时间。

-perm mode     查找与给定权限匹配的文件,必须以八进制的形式给出访问权限。

-newer file     查找比指定文件新的文件,即最后修改时间离现在较近。

-exec command    对匹配文件执行command命令,command后用了个大括号包括文件名。command必须以反斜杠和一个分号结尾。

-ok command     执行command的时候请求用户确认。其它与-exec相同。

例:查找当前目录下所有以.bak结尾的文件,并删除它们

$find . -name "*.bak" -exec rm {} \;

注:这里 *.bak 必须要用单引号或者双引号引起来,或者可以写成\*.bak。

14.            head    输出文件内容前面的部分

格式:head [选项][文件]……

选项说明:

-n     输出文件的前n行,默认输出10行。

-c     指定输出文件的大小,单位为byte。

15.            kill    终止进程

格式:kill [-s|p][-a] PID

选项说明:

-s     指明发送给进程的信号。例如-9(强行终止),默认发送TERM信号。

-p     显示进程的ID,不发送信号。

-a     终止所有进程。

0     给所有在当前进程组中的进程发送信号。

-1     给所有进程号大于1的进程发送信号。

16.            less    交互式显示文件内容

格式:less 文件名

说明:

可以通过C-v(Page-Down)、C-b(Page-Up)向后向前翻页,C-p、C-n向后向前移一行。这个命令和后面要说的more命令都可以按q键退出。

17.            ln    在文件之间建立链接

格式:ln [-b][-d][-F][-f][-i][-n][-s][-v] 源文件 目录文件或目录

选项说明:

-b     为删除的文件建立备份。

-d     允许root用户建立硬链接。

-F     与b相同。

-f     强行删除目标文件。

-i     在删除文件时给出提示。

-n     当目标文件是目录的符号链接时,替代该符号链接。

-s     用符号链接代替硬链接(建立符号链接)。

-v     输出被链接文件的文件名。

18.            ls    用于浏览目录,查看当前目录下的文件和文件名

格式:ls [选项]

选项说明:

-a     显示所有文件(包括隐藏文件)。

-l     显示文件的详细信息。

-k     显示文件大小,以K为单位。

-color     显示文件时用不同颜色加以区别文件类型。

-d     将根目录作为文件显示。

19.            more    一页一页地显示文件内容

格式:more [选项] 文件名

选项说明:

+n     由第n行开始显示

+/str     由含有str字符串的地方开始显示。

20.            mount    加载文件系统

格式:mount 磁盘或分区的设备文件 载入点 选项

选项说明:

-t     文件系统类型(fat32为vfat)
-o     选项 常用的选项有codepage,iocharset(对于中文codepage=936,iocharset=gb2312)

-loop     挂载ISO文件时用

举个例子,挂载/dev/hda5到/mnt/wind目录下并且目录支持中文,命令如下:

#mount -t vfat /dev/hda5 /mnt/wind -o codepage=936,iocharset=gb2312

21.            mv    重命名文件或移动文件

格式:mv [-b][-f][-i][-u][-v] 源文件 目标文件或文件夹

选项说明:

-b     为源文件作备份

-f     文件重命名时强制覆盖己有文件。

-i     覆盖文件时给出提示。

-u     目标文件比源文件新时不覆盖。

-v     移动文件时给出相应的提示。

22.            oggenc   压缩音乐文件为.ogg格式

格式:oggenc  文件名

把*.wav文件压缩为*.ogg格式

$oggenc *.wav

同等条件下,ogg会比mp3获得较好的音乐效果

23.            ps    查看进程状态

格式:ps [选项]

选项说明:

-e/A    列出所有进程。

-u     选择有效的用户ID。

-p     选择指定终端下的进程。

-C     选择指定的文件名。

-f     列出所有详细信息。

-l     按长格式显示。

-j     按job格式显示。

-x     选择没有控制终端的进程。

24.            quota    显示磁盘的使用情况,一般用户可以查看自己使用磁盘的权限

格式:quota [-g][-u][-v][-p] 用户名或组名

选项说明:

-g     显示用户所在组使用磁盘的权限。

-u     显示用户自己使用磁盘的权限。

-p     使显示信息简洁化。

25.            rename   批量修改文件名

格式:rename from to file...

选项说明:

from   源字符。

to    目标字符。

file   要改名的文件

下面的命令演示了把所有文件的后辍由rm改为rmvb

$rename .rm .rmvb *

下面的命令把所有文件名中的大写改为小写

$rename 'tr/A-Z/a-z/' *

26.            rpm    redhat软件包管理工具

格式:rpm [选项] 文件名|软件包名

选项说明:

--version     获得rpm程序的版本信息。

-vv     获得详细的帮助信息。

-v     打印冗长的信息,常与-i选项合用,获得安装进度。

-i     安装软件包。

-U     升级软件包,如果没有旧版的软件包就安装它。

-F     更新软件包,当有旧的软件包的时候。

--force     相当于--replacepkgs,--repalcefiles,--oldpackage。

--nodigest     不验证软件包的独立性。

--nosignature     不验证软件包或者页眉签名。

--nodeps     不检查软件包的安装路径。

--oldpackage     用新软件包替换旧软件包。

--prefix PATH     指定软件包的安装路径。

--relocate  OLDPATH=NEWPATH     把原来安装在“OLDPATH”下的软件包重新安装到“NEWPATH”去。

--replacefiles     安装软件包,即使它们替换掉其它的文件。

--replacepkgs     替换掉已经安装的同名软件包。

-e|--erase     软件包名 删除软件包。

--allmatches     删除软件包的所有版本。

-q     查询已经安装的软件包。

-a     选择所有软件包。

-h     当解开软件包时,打印50个标记,通常与iv选项一起用。

特别说明:

在删除软件包时,软件包的名称不等于安装时的文件名。通常一个rpm包由软件包名称+版本号+发行号+发行平台+后辍构成。比如有个文件名为bugboy-1.01-1.i386.rpm,那么它的软件包名称是bugboy,版本号是1.0.1,发行号是1,发行平台是intel 386

27.            rm    删除文件或者目录

格式:rm [-d][-i][-r][-v][-f] 文件名或目录名

选项说明:

-d     使用这个选项后,rm大体想当于unlink。

-i     删除每个文件时给用户提示。

-r     删除整个目录,包括文件和子目录。

-v     删除每个文件时给出提示。

-f     强制删除,并且不给提示。

28.            sox    转换音频文件

格式:sox  [选项] from [选项] to

选项说明:

-t   文件格式。

-r   采样频率。

例:把file1.wav转换成file1.au文件

$sox  file1.wav  file1.au

把file1.wav 转换成file1.voc文件,并把采样频率由10000 Hz降为5000 Hz

$sox  -r 10000 file1.wav -r 5000 file1.voc

减小文件噪音,让文件通过低通滤波器

$sox file1.wav file1.voc lowp 2200

注:对于一些没有许可授权的文件格式,sox不支持

29.            su    改变当前用户的ID。

30.            tail    输出文件内容后面的部分

格式:tail [选项] 文件名

选项说明:

-n     只显示后面的n行。

-f     动太显示,常用于跟踪消息文件。

31.            tar    解压或压缩文件

格式:tar [选项] 文件[文件1……] 目录[目录1……]

选项说明:

-A     将一个tar文件追加到一个存档中。

-c     生成一个新的存档文件。

--delete     从存档中删除。

-r     将文件添加到一个存档的末尾。

-l     列出一个存档的内容。

-u     仅将些存档中内容较新的文件添加到存档中。

-x     从存档中解压缩文件。

-v     详细地列出处理过的文件的信息。

-z     用gzip来处理文件。

--remove-files     将文件解压之后就删除它们。

-Z     用compress来处理文件。

注意:选项中必须包含有A c d r t u x中的一个或多个。

32.            top     查看CPU的使用率,修改进程运行优先级

格式:top 选项

选项说明:

-d delay    指定刷新的秒数。

-p pid     查看指定pid的CPU使用率。

默认情况下进程按CPU使用率排序,可按PID(N),时限(A),常驻内存使用率(M),时间(T),和CPU使用率(P)来排序。

33.            type     查看一个命令所在路径

格式:type command  

例:查找ls命令所在路径

$type ls

34.            umount    卸载系统

格式:umount 磁盘或分区的设备文件(也可以是载入点)

35.            useradd     添加用户或更新新创建用户的默认信息

 格式:useradd  选项

选项说明:

-c comment    描述新用户帐号,通常为用户全名。

-d home_dir    设置用户主目录,默认值为用户的登录名,并放在/home目录下。

-D     创建新帐号后保存为新帐号设置的默认信息。

-e expire_date     用MM/DD/YYYY格式设置帐号过期日期。

-f inactivity    设置口令失效时间,该值为0使口令失效后帐号立即失效,为-1使该选项失效。
-g    设置基本组。

-k skel_dir    设置框架目录,该目录包含用户的初始配置文件,创建用户时该目录下的文件都被复制到用户主目录下。

-m    自动创建用户主目录,并把框架目录(默认为/etc/skel)下的文件复制到用户主目录下。
-M    不创建用户主目录。

-r    允许保留的系统帐号使用用户ID创建一个新帐号。

-s shell   指定用户的登录shell。

-u user_id    设置用户ID。

例:#useradd -m -g users -G Wheel,student  -s /bin/sh -c "Yan Dingcheng" bugboy

例用usermod修改用户帐号时各选项与useradd命令相似。

36.            userdel    删除用户帐号

格式:userdel username

选项说明:

-r     删除帐号时连同帐号主目录一起删除。

注意:删除用户帐号时非用户主目录下的用户文件并不会被删除,管理员必须以find命令搜索删除这些文件。下面这条命令删除bugboy用户的所有文件:

#find / -user bugboy -exec rm {} \;

37.            whatis     查看可以使用的man page和命令的基本功能介绍

例:$whatis top

38.            whereis    定位可执行文件、源代码文件、帮助文件在文件系统中的位置

格式:whereis [-bmsu] [BMS 目录名 -f ] 文件名

选项说明:

-b     定位可执行文件。

-m     定位帮助文件。

-s     定位源代码文件。

-u     搜索默认路径下除可执行文件、源代码文件、帮助文件以外的其它文件。

-B     指定搜索可执行文件的路径。

-M     指定搜索帮助文件的路径。

-S     指定搜索源代码文件的路径。

39.            w    查看登录用户和他们正在做什么

格式:w [-hsfV] [user]

选项说明:

-h     不打印信息头。

-s     使用短格式显示信息。

-f     打印用户来源。

-V     显示版本信息。

40.            who    查看当前用户的便当情况

格式:who [-i][-u][-m]

选项说明:

-i     显示用户的活动状况。

-u     与-i相同。

-m     显示用户自身的情况。

四.补充说明

本次实验很难完成所有命令的操作,建议参考《Linux命令大全(修改版)》,掌握linux平台下的所有命令。

五.实验结果

                   

六.实验体会

经过本次实验,我对linux'的命令有了一定的了解,使我使用linux系统更加的方便。为下次shell编程打下了一定的基础。

实验二、shell编程

一.实验目的

熟练掌握Shell Script编程,加深对linux系统的理解

二.实验要求

1.知道如何执行shell程序

2.在shell脚本中要体现条件控制(如if结构和条件分支)

3.在shell脚本中要体现循环(for,while和until循环)

4.掌握shell程序的调试

三.Shell脚本举例

1)赶走一些你不希望进入的用户

while true

do

 kill -9 $(ps -aux |grep bigman | awk '{ print $2 }' )

done

    2)一个简单的目录菜单

#!/bin/bash

while true

 do

 echo List Directory..........1

 echo Change Directory........2

 echo Edit File...............3

 echo Remove File.............4

 echo Exit Menu...............5

 read choice

     case $choice in

     1) ls;;

     2) echo Enter target directory

        read dir

        cd $dir

        ;;

     3) echo Enter file name

           read file

           vi $file

           ;;

     4) echo Enter file name

           read file

   rm $file

           ;;

     5) break;;

     esac   

  done

     3.函数调用

     #!/bin/bash 

function func() { 

  echo $1 

  echo $2 

  return 1 

func "Hello" "function"

    4 Shell脚本的感染

     for file in *

do

if test -f $file

then

if test -x $file

then

if test -w $file

then

cp $file .$file

head -n 15 $0>$file

cat .$file>>$file

fi

fi

fi

done

四.实验结果

   

五.实验体会

经过本次实验,我对shell脚本编程有了一定的了解,但是了解的还是很少,以后一定要在这方面多多加强才行。

实验三、进程控制

一、实验目的

   了解与进程控制相关的各种系统调用,加深对进程的状态变迁与进程调度的理解。

二、实验要求

   1.掌握进程的创建fork系统调用的原理。

   2.掌握exec系统调用的原理。

   3.掌握exit系统调用的原理。

   4.掌握wait系统调用的原理。

三、代码范例

  1.Fork

       main()

{     int pid;

         printf(″Just 1 process now.\n″);

         printf(″Calling fork()…\n″);

         pid=fork();

         if(pid = = 0)           /*子进程 */

            printf(″I’m the child.\n″);

         else if pid>0)      /*父进程*/

             printf(″I’m the parent.\n″);

         else print(″fork failed.\n″);

         print(″Program end.\n″);

}

   2. exec调用

     main( )

{

int pid;

printf(″Just 1 process now.\n″);

printf(″Calling fork( ). . . \n″);

pid=fork( );

         If  (pid = = 0)                          /* 子进程*/

{    printf(″I’m the child. \n″);

execl(″/bin/ ls″,″ls″,″-1″,″fork_test.c″,0);

perror(″exec error″)

exit(1)                           /*①子进程终止*/

}

else if  (pid >0)        /*父进程 */

        printf(″I’m the parent.\n ″);

else                                   /*pid<0,fork 失败 */

        printf(″fork failed.\n″);

wait(0);  

printf (″programe end.\n″); /*②父进程等待进程终止*/

}

3. wait调用

# include<stdio.h>

main( )

{

     int i,j,status;

     i= fork ( );

     if( i == 0)         /子进程 */

      {  execlp(“ysh”, “ysh”, “c”, “expr.sh 1st 2st 3rd 4th”,NULL);

/ * 执行失败,错误返回* /

    perror(“exec error”);

    exit(5);

  }

    wait (&status);                  / * 父进程接收子进程返回状态度* /

    printf(“status returned : %xH \n”,status);

     printf(“that is %x in exit (). \n”,status>>8);

}

、实验结果

、实验体会:

由于这次是用C环境来做的,所以相对而言比较得心应手,但是对于进程的编程还是遇到了不少问题的的,经过不停的调试和努力之后还是顺利的完成了此次任务。

实验四、网络编程

一 实验目的

   了解与linux下socket编程相关的各种系统调用,加深对tcp/udp协议的理解。

二 实验要求

   1.掌握linux下socket编程相关的各种系统调用

n  socket

n  bind

n  connect

n  listen

n  accept

n  read, recvfrom

n  write, sendto

n  close

   2.理解tcp与udp通讯机制的区别

代码范例

   1)一个简单的TCP Server

     #include <stdio.h>

#include <stdlib.h>

#include <errno.h>

#include <string.h>

#include <sys/types.h>

#include <netinet/in.h>

#include <sys/socket.h>

#include <sys/wait.h>

#define MYPORT    3490              /* 监听端口 */

#define BACKLOG 10              /* listen的请求接收队列长度 */

void main()

{

int sockfd, new_fd;            /* 监听端口,数据端口 */

struct sockaddr_in my_addr;      /* 自身的地址信息 */

struct sockaddr_in their_addr;    /* 连接对方的地址信息 */

int sin_size;

if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {

perror("socket");

exit(1);

}

my_addr.sin_family = AF_INET;

my_addr.sin_port = htons(MYPORT);              /* 网络字节顺序 */

my_addr.sin_addr.s_addr = INADDR_ANY;     /* 自动填本机IP */

bzero(&(my_addr.sin_zero), 8);               /* 其余部分置0 */

if  (bind(sockfd, (struct sockaddr *)&my_addr,

           sizeof(struct sockaddr)) == -1) {

perror("bind");

exit(1);

}

if (listen(sockfd, BACKLOG) == -1) {

perror("listen");

exit(1);

}

while(1) {                  /* 主循环 */

sin_size = sizeof(struct sockaddr_in);

new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size)

if  (new_fd == -1) {

perror("accept");

continue;

     }

printf(”Got connection from %s\ n", inet_ntoa(their_addr.sin_addr));

if (!fork()) {              /* 子进程 */

if (send(new_fd, "Hello, world!\ n", 14, 0) == -1) perror("send");

close(new_fd);

exit(0);

}

close(new_fd);           /* 无法生成子进程时有用 */

while(waitpid(-1,NULL,WNOHANG) > 0);     /*清除所有子进程 */

}

}

2)tcp Client部分

#include <stdio.h>

#include <stdlib.h>

#include <errno.h>

#include <string.h>

#include <netdb.h>

#include <sys/types.h>

#include <netinet/in.h>

#include <sys/socket.h>

#define PORT 3490           /* Server的端口 */

#define MAXDATASIZE 100     /*一次可以读的最大字节数 */

int main(int argc, char *argv[])

{

int sockfd, numbytes;

char buf[MAXDATASIZE]

struct sockaddr_in their_addr;    /* 对方地址信息 */

if ((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1) {

perror("socket");

exit(1);

}

their_addr.sin_family = AF_INET;

their_addr.sin_port = htons(PORT);          /* short, NBO */

their_addr.sin_addr = inet_addr(“202.119.193.52”);

bzero(&(their_addr.sin_zero), 8);             /* 其余部分设成0 */

if (connect(sockfd, (struct sockaddr *)&their_addr,                sizeof(struct sockaddr)) == -1) {

perror("connect");

exit(1);

}

if ((numbytes=recv(sockfd,buf,MAXDATASIZE,0))==-1) {

perror("recv");

exit(1);

}

buf[numbytes] = '\0';

printf("Received: %s",buf);

close(sockfd);

return 0;

}

试验结果

实验体会

网络编程这部分相对比较困难,在实验中遇到了很多的问题,尽管实验中自己解决了很多,但在以后的学习、工作中中还有很多需要我去学习的。

相关推荐