网络编程文件传输实验报告

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
3、服务器套接字置为监听模式
将服务器设置为监听工作方式后,使用API调用listen():
intlisten(SOCKET s, int backlog);
第一个参数指定套接字。第二个参数指定了正在等待连接的最大队列长度。若无错误发生,则listen()函数返回0。
4、建立连接,进行文件传输
调用gets(path)获得传输文件的路径和存放文件路径,这个过程中还需调用send()函数和recv()函数,共同协调实现文件传送。
fwrite(receiveBuf,1,SIZE,fp);
}
else
{
recv(serConn,receiveBuf,length+SIZE-x+1,0);
printf("文件接收完毕\n");
fwrite(receiveBuf,1,length+SIZE-x,fp);
fclose(fp);
break;
void main()
{
FILE *fp;
int err;
int length=0;
SOCKET clientSocket;
SOCKADDR_IN clientsock_in;
char receiveBuf[100]={"0"};
char ip_addr[16]={"127.0.0.1"};
WORD versionRequired;
TCP协议是其中重要的传输协议,为应用层提供可靠的 端到端的流传输服务.其中套接字取值sock_stream即为TCP的流传输服务
Windows socket包含了人们所熟悉的Berkeley Socket风格的函数库,也包含了一组针对windows的扩展库函数,以使程序员能充分的利用windows驱动消息机制进行编程。
char receiveBuf[SIZE];
long int x=0;
while (1)
{
x=x+SIZE;
if(x<length)
{
cent=(double)x*100.0/(double)length;
printf("已接收:%4.2f%\n",cent);
recv(serConn,receiveBuf,SIZE+1,0);
serConn=accept(serSocket,(SOCKADDR*)&clientsocket,&len);//如果这里不是accept而是conection的话。。就会不断的监听
sprintf(sendBuf,"welcome %s to bejing",inet_ntoa(clientsocket.sin_addr));//找对对应的IP并且将这行字打印到那里
2、地址绑定
当调用socket()创建套接字后,服务器必须把套接字与自己的地址显式地建立联系,以便客户端向该IP地址和端口号的服务进程请求服务,这个过程是通过调用函数bind()实现的。bind()函数原型如下:
int bind(SOCKET s ,const struct sockaddr FAR*name ,int namelen);
i++;
}
i=0;
if((fp=fopen(path,"rb"))==NULL)
{
i=1;
printf("文件未打开\n");
}
}while(i);
fseek(fp,0L,SEEK_END);
length=ftell(fp);
printf("待传送文件大小:%d\n",length);
printf("文件已经打开等待主机消息......\n");
三、设计概述
1、创建套接字
服务进程和客户进程在实现通信前必须创建各自的套接字,然后才能用相应的套接字进行发送接收操作,服务进程总是先于客户端进程启动,服务器端进程和客户端进程创建套接字。Socket()函数实现代码如下:
SOCKET serSocket=socket(AF_INET,SOCK_STREAM,0);//创建了可识别套接字
return;//结束
}
clientSocket=socket(AF_INET,SOCK_STREAM,0);
printf("请输入主机IP:\n");
scanf("%s",ip_addr);
//连接服务器
clientsock_in.sin_addr.S_un.S_addr=inet_addr(ip_addr);
WSADATA wsaData;
versionRequired=MAKEWORD(1,1);
err=WSAStartup(versionRequired,&wsaData);//协议库的版本信息
if (!err)
{
printf("客户端嵌套字已经打开!\n");
}
else
{
printf("客户端的嵌套字打开失败!\n");
clientsock_in.sin_family=AF_INET;
clientsock_in.sin_port=htons(6000);
connect(clientSocket,(SOCKADDR*)&clientsock_in,sizeof(SOCKADDR));//开始连接
recv(clientSocket,receiveBuf,101,0);
if(y<length)
{
cent=(double)y*100.0/(double)length;
printf("已发送:%4.2f%\n",cent);
send(clientSocket,trans,SIZE+1,0);
}
else
{
send(clientSocket,trans,length+SIZE-y+1,0);
//发送欢迎信息
send(serConn,sendBuf,strlen(sendBuf)+1,0);
FILE *fp;
lable1: printf("客户端已打开\n请输入存放文件地址:\n");
char path[100]={"0"};
int i=0;
while(path[i]!='\0')
{
if(path[i]=='/')
send(clientSocket,sendBuf,21,0);
fseek(fp,0L,SEEK_SET);
//传送文件
long int y=0;
double cent;
char trans[SIZE];
while(!feof(fp))
{
fread(trans,1,SIZE,fp);
y=y+SIZE;
四、源代码
服务器端
#include <WINSOCK2.H>
#include <stdio.h>
#pragma comment(lib,"ws2_32.lib")
#define SIZE 1024*8
void main()
{
//创建套接字
WORD myVersionRequest;
WSADATA wsaData;
//得到文件大小
char datalength[20];
long int length=0;
recv(serConn,datalength,21,0);
length=atol(datalength);
printf("得到文件大小:%d\n",length);
//开始传送
double cent=0.0;
基于TCP的网络文件传输实验报告
一、实验目的
1、熟悉TCP/IP协议的功能和网络操作
2、编写小型的socket应用程序,初步了解windows环境下使用sockets编程,实现点对点文本传输。
二、实验原理
本程序是基于TCP/IP协议栈的网络编程,使用C语言,利用操作系统提供的套接字网络编程接口进行编写
//得到主机开始传送消息
recv(clientSocket,receiveBuf,101,0);
printf(Βιβλιοθήκη Baidu%s\n",receiveBuf);
if(strcmp(receiveBuf,"开始传送")==0)
{
//传送文件长度
char sendBuf[20];
ltoa(length,sendBuf,10);
}
}
}
closesocket(serConn);//关闭
WSACleanup();//释放资源的操作
system("pause");
}
客户端
#include <WINSOCK2.H>
#include <stdio.h>
#pragma comment(lib,"ws2_32.lib")
#define SIZE 1024*8
closesocket(clientSocket);
WSACleanup();
}
}
fclose(fp);
}
printf("文件发送完毕\n");
system("pause");
}
五、实验结果及分析:
客户端运行结果
服务器端运行结果
六、心得体会:网络编程的实验课虽然只有八次,但是我们充分了解了各种网络编程和winsock控件的知识,了解了TCP/IP协议的相关知识以及其中两个重要协议TCP UDP的特点与差异,进一步学习了文件传输等知识,创建套接字 监听 传输 关闭等过程,直到最后写出C/S模式的文件传输程序 感觉我们巩固了教材的内容 实践的能力也得到了提高 不足之处就是自己粗心大意,在写代码时候 参数 注解等经常注明的不够好,希望以后能养成良好的编程习惯
printf("%s\n",receiveBuf);
char path[100]={"0"};
gets(path);
int i=0;
do
{
printf("请输入文件地址:\n");
gets(path);
while(path[i]!='\0')
{
if(path[i]=='/')
path[i]='\\';
//开始进行监听
//////////////////////////////////////////////////////////////////////////
SOCKADDR_IN clientsocket;
int len=sizeof(SOCKADDR);
SOCKET serConn;
char sendBuf[50];
myVersionRequest=MAKEWORD(1,1);
int err;
err=WSAStartup(myVersionRequest,&wsaData);
if (!err)
{
printf("已打开套接字\n");
}
else
{
//进一步绑定套接字
printf("嵌套字未打开!");
return;
addr.sin_port=htons(6000);//绑定端口
bind(serSocket,(SOCKADDR*)&addr,sizeof(SOCKADDR));//绑定完成
listen(serSocket,5);//其中第二个参数代表能够接收的最多的连接数
//////////////////////////////////////////////////////////////////////////
path[i]='\\';
i++;
}
gets(path);
if((fp=fopen(path,"wb"))==NULL)
{
printf("文件未打开\n");
goto lable1;
}
else
{
printf("文件已打开开始文件传输......\n");
//发送开始标志
send(serConn,"开始传送",strlen("开始传送")+1,0);
}
SOCKET serSocket=socket(AF_INET,SOCK_STREAM,0);//创建了可识别套接字
//需要绑定的参数
SOCKADDR_IN addr;
addr.sin_family=AF_INET;
addr.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//ip地址
Windows Sockets的规范本意在于提供给应用开发者一套简单的API,并让个网络应用软件开发商遵守该协议。此外在一个特定的版本windows基础上,Windows socket也定义了一个二进制借口(ABI),从此来保证Windows socket API应用程序能够在任何符合Windows socket协议的实现上工作。
相关文档
最新文档