实验 1
C/S 模式文件传输网络应用开发
1、实验目的
2、对学生要求
通过实验了解C/S 模式下的网络应用开发基本方法,理解TCP 和UDP 并发。
服务器的基本原理,掌握
C/S
模式下的文件传输的网络应用的开发过程和方法。
1.
掌握UDP 循环服务器原理;
2.
掌握TCP 循环服务器原理;
3.
学会构建并发服务器;
4.
根据算法编写与实验内容相关的程序,该程序能实现文件服务器功能。
开发出支持UDP 和TCP 协议的服务器,且不同协议的服务器能够通过自己
定义的传输方法将文件传输给支持相应协议的客户端。
在UDP 方式的大文件传输,每次传输的文件大小超过一个数据包,必须考
虑数据包的切割分块问题。
3、实验内容
4、实验过程
(1)
构建并发服务器的基本思路
基本思路为服务器主线程等待客户端发起连接,接收到客户端请求时,创建一
个子线程为其提供服务。
主线程
1.
创建套接字并将其绑定到服务器所使用的熟知地址上。使该套接字处于
未连接状态;
2.
重复调用recvfrom 接收客户端的下一个请求,并且创建新的子线程处理
(2)
基于多线程方法构建
UDP
并发服务器的过程
(3)
基于多线程方法构建
TCP
并发服务器流程
响应。
子线程
1.
在线程创建时接收一个给定的请求,并访问套接字;
2.
根据应用协议构造应答,并调用
sendto
将应答发回给客户;
3.
退出(即子线程处理完一个请求后便终止)。
主线程
1.
创建套接字并将其绑定到服务器所使用的熟知地址上。使该套接字处于
未连接状态;
2.
将套接字设置为被动模式,使其准备为服务器所用;
3.
重复调用
accept
接收客户端的请求,并且创建子线程处理响应。
子线程
1.
在线程创建时接收连接请求(例如,针对连接的套接字);
2.
用该连接与客户端进行交互:接收请求并发回应答;
3.
关闭连接并退出。子线程在处理完来自一个客户端的所有请求后退出。
/*服务器端源程序*/
#include
#include
#include
#include
#include
#include
#include
#include
main()
{
char
c,
buf[1024],
file[30];
int
fromlen,
source;
int
k,
s,
ns;
struct
sockaddr_in
sin;
struct
hostent
*hp;
system(″clear″);
printf(″\n″);
printf(″\n\n\t\t 输入要传输的文件名:″);
5、参考内容
scanf(″%s″,
file);
if
((source
=
open(file,
O_RDONLY))
<
0){
perror(″源文件打开出错″);
exit(1);
}
printf(″\n\t\t 在传送文件,稍候…″);
hp
=
gethostbyname(″server″);
if
(hp
==
NULL){
perror(″返回主机地址信息错!!!″);
exit(2);
}
s
=
socket(AF_INET,
SOCK_STREAM,
0);
if
(s
<
0)
{
perror(″获取SOCKET 号失败!!!″);
exit(3);
}
sin.sin_family
=
AF_INET;
sin.sin_port=htons(1500);/*使用端口1500*/
bcopy(hp->h_addr,&sin.sin_addr,hp->h_length);
if
(bind(s,
&sin,
sizeof(sin))
<
0)
{
perror(″不能将服务器地址捆绑到SOCKET 号上!!!″);
colse(s);
exit(4);
}
if
(listen(s,5)<0)
{
perror(″sever:listen″);
exit(5);
}
while
(1)
{
if
((ns
=
accept(s,
&sin,
&fromlen))<0)
{
perror(″sever:accept″);
exit(6);
}
/*
每次接受客户机连接,应将用于读的源文件指针移到文件头
*/
seek(source,
OL,
0);
write(ns,
file,
sizeof(file));
/*发送文件名*/
while
((k
=
read(source,
buf,
sizeof(buf)))
>
0)
{
write(ns,
buf,
k);
}
printf(″\n\n\t\t 传输完毕!!!\n″);
close(ns);
}
close(source);
exit(0);
6、思考题
}
1.
什么是并发服务器?
2.
TCP
并发服务器和
UDP
并发服务器的区别是什么?
3.
一般在什么情况下使用
UDP
并发服务器?
4.
TCP
并发服务器解决了
TCP
循环服务器的什么问题?同时又带来了什么
问题?