文件传输问题实验报告

时间:2024.4.13

操作系统——文件传输

目录

一、       实验目的-- - 2 -

二、       实验原理-- - 2 -

三、       设计概述-- - 2 -

1     windows DLL的初始化和结束释放-- - 2 -

2     创建套接字-- - 2 -

3     地址绑定-- - 2 -

4     服务器套接字置为监听模式-- - 2 -

5     建立连接,进行文件传输-- - 3 -

四、       实验结果及分析:-- - 3 -

客户端运行结果-- - 3 -

服务器端运行结果-- - 4 -

五、       源代码-- - 4 -

服务器端-- - 4 -

客户端-- - 6 -

一、   实验目的

1、   熟悉TCP/IP协议的功能和网络操作

2、   编写小型的socket应用程序,初步了解windows环境下使用sockets编程,实现点对点文本传输。

二、   实验原理

Windows socket包含了人们所熟悉的Berkeley Socket风格的函数库,也包含了一组针对windows的扩展库函数,以使程序员能充分的利用windows驱动消息机制进行编程。

Windows Sockets的规范本意在于提供给应用开发者一套简单的API,并让个网络应用软件开发商遵守该协议。此外在一个特定的版本windows基础上,Windows socket也定义了一个二进制借口(ABI),从此来保证Windows socket API应用程序能够在任何符合Windows socket协议的实现上工作。

三、   设计概述

1、   windows DLL的初始化和结束释放

先调用WSAStartup()函数对ws_32.dll进行加载初始化,协商windows版本支持,并分配必要的资源。

在应用程序关闭套接字后,还应调用WSACleanUp()函数来卸载和中止动态链接库,释放资源,以备以后使用。

2、   创建套接字

服务进程和客户进程在实现通信前必须创建各自的套接字,然后才能用相应的套接字进行发送接收操作,服务进程总是先于客户端进程启动,服务器端进程和客户端进程创建套接字。Socket()函数实现代码如下:

SOCKET serSocket=socket(AF_INET,SOCK_STREAM,0);//创建了可识别套接字

3、   地址绑定

当调用socket()创建套接字后,服务器必须把套接字与自己的地址显式地建立联系,以便客户端向该IP地址和端口号的服务进程请求服务,这个过程是通过调用函数bind()实现的。bind()函数原型如下:

int bind(SOCKET s ,const struct sockaddr FAR*name ,int namelen);

4、   服务器套接字置为监听模式

将服务器设置为监听工作方式后,使用API调用listen():

   int listen(SOCKET s, int backlog);

第一个参数指定套接字。第二个参数指定了正在等待连接的最大队列长度。若无错误发生,则listen()函数返回0。

5、   建立连接,进行文件传输

调用gets(path)获得传输文件的路径和存放文件路径,这个过程中还需调用send()函数和recv()函数,共同协调实现文件传送。

四、   实验结果及分析:

客户端运行结果

服务器端运行结果

五、   源代码

    服务器端

#include <WINSOCK2.H>
#include <stdio.h>
#pragma comment(lib,"ws2_32.lib")
#define SIZE 1024*8
void main()
{
//创建套接字
WORD myVersionRequest;
WSADATA wsaData;
myVersionRequest=MAKEWORD(1,1);
int err;
err=WSAStartup(myVersionRequest,&wsaData);
if (!err)
{
    printf("已打开套接字\n");

}
else
{
    //进一步绑定套接字
    printf("嵌套字未打开!");
    return;
}
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地址
addr.sin_port=htons(6000);//绑定端口

bind(serSocket,(SOCKADDR*)&addr,sizeof(SOCKADDR));//绑定完成
listen(serSocket,5);//其中第二个参数代表能够接收的最多的连接数

//////////////////////////////////////////////////////////////////////////
//开始进行监听
//////////////////////////////////////////////////////////////////////////
SOCKADDR_IN clientsocket;
int len=sizeof(SOCKADDR);
SOCKET serConn;
char sendBuf[50];
serConn=accept(serSocket,(SOCKADDR*)&clientsocket,&len);//如果这里不是accept而是conection的话。。就会不断的监听
sprintf(sendBuf,"welcome %s to bejing",inet_ntoa(clientsocket.sin_addr));//找对对应的IP并且将这行字打印到那里
//发送欢迎信息
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]=='/')
    path[i]='\\';
   i++;
}
gets(path);
if((fp=fopen(path,"wb"))==NULL)
{
   printf("文件未打开\n");
   goto lable1;
}
else
{
   printf("文件已打开 开始文件传输......\n");
   //发送开始标志
   send(serConn,"开始传送",strlen("开始传送")+1,0);
   //得到文件大小
   char datalength[20];
   long int length=0;
   recv(serConn,datalength,21,0);
   length=atol(datalength);
   printf("得到文件大小: %d\n",length);
   //开始传送
   double cent=0.0;
   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);
     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;
    }
   }
}
closesocket(serConn);//关闭
WSACleanup();//释放资源的操作
system("pause");

}

客户端

#include <WINSOCK2.H>
#include <stdio.h>
#pragma comment(lib,"ws2_32.lib")
#define SIZE 1024*8
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;
WSADATA wsaData;
versionRequired=MAKEWORD(1,1);
err=WSAStartup(versionRequired,&wsaData);//协议库的版本信息

if (!err)
{
    printf("客户端嵌套字已经打开!\n");
}
else
{
    printf("客户端的嵌套字打开失败!\n");
    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);
clientsock_in.sin_family=AF_INET;
clientsock_in.sin_port=htons(6000);
connect(clientSocket,(SOCKADDR*)&clientsock_in,sizeof(SOCKADDR));//开始连接
recv(clientSocket,receiveBuf,101,0);
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]='\\';
    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");
//得到主机开始传送消息
recv(clientSocket,receiveBuf,101,0);
printf("%s\n",receiveBuf);
if(strcmp(receiveBuf,"开始传送")==0)
{
   //传送文件长度
   char sendBuf[20];
   ltoa(length,sendBuf,10);
   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;
    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);
     closesocket(clientSocket);
     WSACleanup();
    }
   }
   fclose(fp);
}
printf("文件发送完毕\n");
system("pause");

}

更多相关推荐:
传热实验实验报告

江苏大学实验报告完成报告所需时间教师评定实验传热实验一实验目的1了解换热器的结结构及用途2学习换热器的操作方法3了解传热系数的测定方法4测定所给换热器的传热系数K5学习应用传热学的概念和原理去分析和强化传热过程...

化工原理实验传热实验报告

传热膜系数测定实验第四组一实验目的1了解套管换热器的结构和壁温的测量方法2了解影响给热系数的因素和强化传热的途径3体会计算机采集与控制软件对提高实验效率的作用4学会给热系数的实验测定和数据处理方法二实验内容1测...

传热实验报告

传热膜系数测定实验实验日期20xx129班级姓名学号同组人实验装置一报告摘要本实验以套管式换热器为研究对象并用常压下100的水蒸汽冷凝空气来测定传热膜系数通过实验掌握传热膜系数及传热系数的测定方法并确定传热膜系...

传热实验报告

传热膜系数的测定摘要在化工领域中传热膜系数与传热系数对能量传递效率有非常显著的影响对传热膜系数及传热系数的考察广泛应用于不同反应器的设计在提高能量利用效率方面上具有重要意义本实验采用套管换热器以100的水蒸气冷...

化工原理实验报告(传热)

北京化工大学化工原理实验报告传热膜系数测定实验院部化学工程学院专业化学工程与工艺班姓名江海洋20xx011136同组人员王彬刘玥波方郡实验名称传热膜系数测定实验实验日期20xx1128传热膜系数测定实验一摘要本...

传热实验实验报告

广西大学实验报告姓名专业月实验内容传热实验指导教师一实验名称传热实验二实验目的1熟悉套管换热器的结构2测定出K整理出NuRe的关系式求出Am三实验原理本实验有套管换热器4套列管式换热器4套首先介绍套管换热器套管...

化工原理实验报告:传热实验

化工原理实验报告实验名称传热膜系数测定实验实验时间20xx年11月姓名班级学号同组人正文一报告摘要套管换热器为本实验的研究对象而以冷空气及热蒸汽为介质冷空气走黄铜管内热蒸汽走环隙研究热蒸汽与冷空气之间的传热过程...

实验五 传热实验

实验五传热实验51实验目的1学习传热系数的测定方法2学习传热膜系数及其准数联式的测定方法52实验原理本实验有套管换热器4套列管式换热器4套首先介绍套管换热器套管换热器管间进饱和蒸汽冷凝放热以加热管内的空气实验设...

传热膜系数测定实验报告

北方民族大学学生实验报告院部化学与化学工程姓名郭俊雄学号20xx2995专业化学工程与工艺班级081同组人员林艺明胡鹏秦开勉课程名称化工原理实验实验名称传热膜系数测定实验实验日期20xx114批阅日期成绩教师签...

传热实验(四川大学)

四川大学化学学院李志强10420xx051化工原理实验报告学院化学学院专业化学类班级姓名李志强学号日期20xx年5月8日实验名称传热实验一实验目的1测定热空气冷却水在套管换热器中的总传热系数K2测定空气或水在圆...

实验五套管换热器传热实验实验报告数据处理

实验五套管换热器传热实验数据处理我们组做的是实验I1Qms1c1t求K得先求Q1Qms1C1t1其中C1所以得先求ms1C1t11mVs1s1要得求Vs1Vs1u1AVs1C0A02gRoC0为空流系数C008...

传热实验 江苏大学

江苏大学实验报告系别班级做实验日期年月日姓名学号3101163031交报告日期月日完成报告所需时间教师评定实验传热实验一实验目的1了解换热器的结构及用途2学习换热器的操作方法并了解传热系数的测定方法3测定所给换...

传热实验实验报告(48篇)