网络编程实验报告

  • 格式:pdf
  • 大小:169.55 KB
  • 文档页数:19

⽹络编程实验报告

程序实践报告

⼀、程序实践概述1、题⽬名称:

Linux程序设计基础

2、时间进度:

2012年6⽉19⽇到2012年7⽉5⽇

3、开发环境:

Ubunto 10.04

⼆、问题分析1、功能说明:

①编程实现快速排序算法;

②实现⽂本⽂件拷贝函数copy(f_source, f_target);即实现如下功能:

$ ./copy f1 f2

以上程序执⾏后当前⽬录会形成⼀个新的⽂件f2,且其内容与f1完全⼀致。

③编写⼀个程序,要求:输⼊N个学⽣的学号和成绩,并保存在stu.txt⽂本⽂件中,对学⽣成绩进⾏排序并把排序后的结果输出到score.txt⽂件中,同时在屏幕上输出⾼于平均成绩的学⽣的学号和成绩。

④编写⼀个程序找出串str1和串str2的所有最长公共⼦串。

2、解决⽅案:

(1)

将原问题分解为若⼲个规模更⼩但结构与原问题相似的⼦问题。递归地解这些⼦问题,然后将这些⼦问题的解组合为原问题的解。

(2)

定义⽂件指针FILE *fp;表⽰fp是指向FILE结构的指针变量,通过fp 即可找存放某个⽂件信息的结构变量,然后按结构变量提供的信息找到该⽂件,实施对⽂件的操作。(3)

创建⼀个结构体储存学⽣的学号和成绩,利⽤⽂件操作写⼊⽂档。对成绩进⾏排序,将⼤于平均成绩的输出到屏幕。

(4)

创建两个数组,搜索字符串,寻找最⼤的匹配⼦串。

三、⽅案设计1、模块结构:

模块功能图和模块描述

(1)

在a[left..right]中任选⼀个记录作为基准,以此基准将当前⽆序区划分为左、右两个较⼩的⼦区间a[left..pivotpos-1)和a[pivotpos+1..right],并使左边⼦区间中所有记录的关键字均⼩于等于基准记录(不妨记为pivot)的关键字pivot.key,右边的⼦区间中所有记录的关键字均⼤于等于pivot.key,⽽基准记录pivot则位于正确的位置(pivotpos)上,

它⽆须参加后续的排序。

划分的关键是要求出基准记录所在的位置pivotpos。划分的结果可以简单地表⽰为:a[left..pivotpos-1].keys≤a[pivotpos].key≤a[pivotpos+1..right].keys

其中left≤pivotpos≤right。

(2)fopen函数

⽤来打开⼀个⽂件,其调⽤的⼀般形式为:⽂件指针名=fopen(⽂件名,使⽤⽂件⽅式)。其中,“⽂件指针名”必须是被说明为FILE 类型的指针变量,“⽂件名”是被打开⽂件的⽂件名。“使⽤⽂件⽅式”是指⽂件的类型和操作要求。“⽂件名”是字符串常量或字符串数组。fclose函数

调⽤的⼀般形式是: fclose(⽂件指针);正常完成关闭⽂件操作时,fclose函数返回值为0。如返回⾮零值则表⽰有错误发⽣。⽂件的读写对⽂件的读和写是最常⽤的⽂件操作。(3)

创建⼀个结构体储存学⽣的学号和成绩,每个学⽣的信息都储存在⼀个数组⾥。

利⽤⽂件操作写⼊⽂档。

对成绩进⾏排序,更新数组信息,将⼤于平均成绩的输出到屏幕。

(4)

将两个字符串储存在数组⾥,从⾸地址开始查找相同字符。如果遇到相同字符则开始记录位置,从该位置开始计数,到不匹配位置。重新搜索,如果最⼤长度超过记录则更新。2、数据结构:

(1)链表,递归

(2)⽂件操作

(3)⽂件操作,数组

(4)数组3、总体流程:

给出流程图

(1)

第⼀步:(初始化)设置两个指针i和j,它们的初值分别为区间的下界和上界,即i=low,i=high;选取⽆序区的第⼀个记录R[i](即R[low])作为基准记录,并将它保存在变量pivot 中;

第⼆步:令j⾃high起向左扫描,直到找到第1个关键字⼩于pivot.key的记录R[j],将R[j])移⾄i所指的位置上,这相当于R[j]和基准R[i](即pivot)进⾏了交换,使关键字⼩于基准关键字pivot.key的记录移到了基准的左边,交换后R[j]中相当于是pivot;然后,令i指针⾃i+1位置开始向右扫描,直⾄找到第1个关键字⼤于pivot.key的记录R[i],将R[i]移到i所指的位置上,这相当于交换了R[i]和基准R[j],使关键字⼤于基准关键字的记录移到了基准的右边,交换后R[i]中⼜相当于存放了pivot;接着令指针j ⾃位置j-1开始向左扫描,如此交替改变扫描⽅向,从两端各⾃往中间靠拢,直⾄i=j时,i便是基准pivot最终的位置,将pivot放在此位置上就完成了⼀次划分。

(2)

(3)

(4)找到第⼀个相等的字符,记录下位置。查找最⼤的相同字符,如果有⼤于前⼀次搜索的,则更新长度。 4、关键算法:给出关键算法描述 (1)void quickSort(int a[],int left,int right){ int i,j,temp; i=left; j=right; temp=a[left]; if (left>right)return ; while (i!=j)

while(a[j]>=temp && j>i) j--;

if(j>i)

a[i++]=a[j];

while(a[i]<=temp && j>i) i++;

if(j>i)

a[j--]=a[i];

}

a[i]=temp;

quickSort(a,left,i-1);

quickSort(a,i+1,right);

}

(2)#include

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

FILE*f1,*f2;

char c;

f1=fopen(argv[1],"r");

f2=fopen(argv[2],"w");

while((c=getc(f1))!=EOF)

{

printf("%c",c);

putc(c,f2);

}

fclose(f1);

fclose(f2);

}

(3)for(i=0;i

{

for(j=0;j

{

if(stu[j].score>stu[j+1].score) {

temp.num=stu[j].num;

temp.score=stu[j].score;stu[j].num=stu[j+1].num;

stu[j].score=stu[j+1].score; stu[j+1].num=temp.num;

stu[j+1].score=temp.score;

}

}

(4)for (i=1; i<=len1; ++i)

{

for (j=1; j<=len2; ++j)

{

if (str1[i-1] == str2[j-1])

{

gg[i][j] = gg[i-1][j-1] + 1;

max = gg[i][j] > max ? gg[i][j] : max;

}

else

{

gg[i][j] = 0;

}

}

}

for (i=len1+1; i>0; --i)

{

for (j=len2+1; j>0; --j)

{

if (gg[i][j] == max)

{

str[max-1] = str2[j-1];

max--;

break;

}

}

}

程序实践概述1、题⽬名称:Socket编程基础

(1)时间服务器

(2)远程⽂件备份服务器2、时间进度: 2012年6⽉19⽇到2012年7⽉5⽇

3、开发环境:

Ubuntu 10.04

⼆、问题分析1、功能说明:

①编程实现时间服务器

编写⼀个⽹络时间服务器timeserver,该服务器能应具有如下功能:

够为⽹络上的⽤户提供时间服务,即为⽹络⽤户返回服务器的当前时间;

记录发出请求的⽹络⽤户的IP地址(保存到⽂件中),格式如下:IP地址请求时间

编写时间服务客户端timeclient,该客户端能够向服务器发送时间服务请求,并把获得的时间返回给⽤户。

②编程实现远程⽂件备份服务器

分别采⽤TCP或UDP协议编写⼀个远程数据备份服务器,运⾏客户端将本地⽂件备份到远程的服务器中。

服务器的功能:接受客户端请求,把客户端的⽂件进⾏备份(可以备份到指定的⽂件夹)。

客户端的功能:与远程服务器进⾏连接,在连接后把本地的⽂件发送给远程备份服务器。2、解决⽅案:

服务器端过程就是socket->bind->listen->accpet->Read,write

⽽对于客户端则是socket->connect->read,write

三、⽅案设计1、模块结构:

模块功能图和模块描述

服务器端:1、创建套接字;

使⽤socket()#include

#include

int socket(int domain,int type,int protocol)

建⽴服务器端的socket套接字2、绑定套接字到⼀个IP地址和⼀个端⼝上;

使⽤bind()#include

#includeint bind(int sockfd,struct sockaddr * myaddr,int addrlen);

3、将套接字设置为监听模式,以等待连接请求;

使⽤listen()#include

int listen(int sockfd,int backlog)

4、请求到来后,接受连接请求,并返回⼀个与此次连接对应的套接字;

使⽤accept()#include

int accept(int sockfd,struct sockaddr * addr,int * addrlen)

此时新建连接,并创建新的Socket套接字,此时addr为客户端的addr信息。5、⽤返回的套接字和客户端进⾏通信;

使⽤recv()和send()int read(int fd,char * buf,int len)

int write(int fd,char * buf,int len)

6、关闭当前的连接,进⼊等待状态,继续等待客户端的连接;

使⽤close()#include

int close(int sockfd);

7、关闭服务器端的套接字描述符;

使⽤close()#include

int close(int sockfd);

客户端:1、创建客户端套接字;

使⽤socket()#include

#include

int socket(int domain,int type,int protocol)

2、向服务器发出连接请求;

使⽤connect()#include

#include

int connect(int sockfd,struct sockaddr * servaddr,int addrlen)

其中参数servaddr指定远程服务器的套接字地址,包括服务器的IP地址和端⼝号3、和服务器端进⾏⽹络通信;

使⽤recv()和send()