网络编程实验报告
- 格式: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()