网络编程文件传输实验报告Word文件下载.doc
《网络编程文件传输实验报告Word文件下载.doc》由会员分享,可在线阅读,更多相关《网络编程文件传输实验报告Word文件下载.doc(9页珍藏版)》请在冰豆网上搜索。
二、实验原理
本程序是基于TCP/IP协议栈的网络编程,使用C语言,利用操作系统提供的套接字网络编程接口进行编写
TCP协议是其中重要的传输协议,为应用层提供可靠的端到端的流传输服务.其中套接字取值sock_stream即为TCP的流传输服务
Windowssocket包含了人们所熟悉的BerkeleySocket风格的函数库,也包含了一组针对windows的扩展库函数,以使程序员能充分的利用windows驱动消息机制进行编程。
WindowsSockets的规范本意在于提供给应用开发者一套简单的API,并让个网络应用软件开发商遵守该协议。
此外在一个特定的版本windows基础上,Windowssocket也定义了一个二进制借口(ABI),从此来保证WindowssocketAPI应用程序能够在任何符合Windowssocket协议的实现上工作。
三、设计概述
1、创建套接字
服务进程和客户进程在实现通信前必须创建各自的套接字,然后才能用相应的套接字进行发送接收操作,服务进程总是先于客户端进程启动,服务器端进程和客户端进程创建套接字。
Socket()函数实现代码如下:
SOCKETserSocket=socket(AF_INET,SOCK_STREAM,0);
//创建了可识别套接字
2、地址绑定
当调用socket()创建套接字后,服务器必须把套接字与自己的地址显式地建立联系,以便客户端向该IP地址和端口号的服务进程请求服务,这个过程是通过调用函数bind()实现的。
bind()函数原型如下:
intbind(SOCKETs,conststructsockaddrFAR*name,intnamelen);
3、服务器套接字置为监听模式
将服务器设置为监听工作方式后,使用API调用listen():
intlisten(SOCKETs,intbacklog);
第一个参数指定套接字。
第二个参数指定了正在等待连接的最大队列长度。
若无错误发生,则listen()函数返回0。
4、建立连接,进行文件传输
调用gets(path)获得传输文件的路径和存放文件路径,这个过程中还需调用send()函数和recv()函数,共同协调实现文件传送。
四、源代码
服务器端
#include<
WINSOCK2.H>
stdio.h>
#pragmacomment(lib,"
ws2_32.lib"
)
#defineSIZE1024*8
voidmain()
{
//创建套接字
WORDmyVersionRequest;
WSADATAwsaData;
myVersionRequest=MAKEWORD(1,1);
interr;
err=WSAStartup(myVersionRequest,&
wsaData);
if(!
err)
printf("
已打开套接字\n"
);
}
else
//进一步绑定套接字
嵌套字未打开!
"
return;
}
//需要绑定的参数
SOCKADDR_INaddr;
addr.sin_family=AF_INET;
addr.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
//ip地址
addr.sin_port=htons(6000);
//绑定端口
bind(serSocket,(SOCKADDR*)&
addr,sizeof(SOCKADDR));
//绑定完成
listen(serSocket,5);
//其中第二个参数代表能够接收的最多的连接数
//////////////////////////////////////////////////////////////////////////
//开始进行监听
SOCKADDR_INclientsocket;
intlen=sizeof(SOCKADDR);
SOCKETserConn;
charsendBuf[50];
serConn=accept(serSocket,(SOCKADDR*)&
clientsocket,&
len);
//如果这里不是accept而是conection的话。
。
就会不断的监听
sprintf(sendBuf,"
welcome%stobejing"
inet_ntoa(clientsocket.sin_addr));
//找对对应的IP并且将这行字打印到那里
//发送欢迎信息
send(serConn,sendBuf,strlen(sendBuf)+1,0);
FILE*fp;
lable1:
客户端已打开\n请输入存放文件地址:
\n"
charpath[100]={"
0"
};
inti=0;
while(path[i]!
='
\0'
if(path[i]=='
/'
path[i]='
\\'
;
i++;
gets(path);
if((fp=fopen(path,"
wb"
))==NULL)
文件未打开\n"
gotolable1;
文件已打开开始文件传输......\n"
//发送开始标志
send(serConn,"
开始传送"
strlen("
)+1,0);
//得到文件大小
chardatalength[20];
longintlength=0;
recv(serConn,datalength,21,0);
length=atol(datalength);
得到文件大小:
%d\n"
length);
//开始传送
doublecent=0.0;
charreceiveBuf[SIZE];
longintx=0;
while
(1)
{
x=x+SIZE;
if(x<
length)
cent=(double)x*100.0/(double)length;
已接收:
%4.2f%\n"
cent);
recv(serConn,receiveBuf,SIZE+1,0);
fwrite(receiveBuf,1,SIZE,fp);
}
else
recv(serConn,receiveBuf,length+SIZE-x+1,0);
文件接收完毕\n"
fwrite(receiveBuf,1,length+SIZE-x,fp);
fclose(fp);
break;
closesocket(serConn);
//关闭
WSACleanup();
//释放资源的操作
system("
pause"
客户端
intlength=0;
SOCKETclientSocket;
SOCKADDR_INclientsock_in;
charreceiveBuf[100]={"
charip_addr[16]={"
127.0.0.1"
WORDversionRequired;
versionRequired=MAKEWORD(1,1);
err=WSAStartup(versionRequired,&
//协议库的版本信息
客户端嵌套字已经打开!
客户端的嵌套字打开失败!
//结束
clientSocket=socket(AF_INET,SOCK_STREAM,0);
printf("
请输入主机IP:
scanf("
%s"
ip_addr);
//连接服务器
clientsock_in.sin_addr.S_un.S_addr=inet_addr(ip_addr);
clientsock_in.sin_family=AF_INET;
clientsock_in.sin_port=htons(6000);
connect(clientSocket,(SOCKADDR*)&
clientsock_in,sizeof(SOCKADDR));
//开始连接
recv(clientSocket,receiveBuf,101,0);
%s\n"
receiveBuf);
do
请输入文件地址:
gets(path);
while(path[i]!
i=0;
if((fp=fopen(path,"
rb"
i=1;
}while(i);
fseek(fp,0L,SEEK_END);
length=ftell(fp);
待传送文件大小:
文件已经打开等待主机消息......\n"
//得到主机开始传送消息
if(strcmp(receiveBuf,"
)==0)
//传送文件长度
charsendBuf[20];
l