一 : 网络文件传输
一. 实验目的及实验环境
<1>实验环境
本次实验采用MFC工程,工程采用MFC对话框界面,工程名称为Ftp,生成的类有CFtpApp类和CFtpDlg类。[www.61k.com]
<2>实验目的
网络文件传输;了解网络文件传输的方法,了解FTP协议基础,学习使用WinSock实现网络文件的传输。了解点对点(P2P)网络文件传输的方法,学习使用WinSock实现P2P网络文件的传输
二. 实验内容
<1>FTP协议基础
FTP 是 TCP/IP 协议组中的协议之一,该协议是Internet文件传送的基础,它由一系列规格说明文档组成,目标是提高文件的共享性,提供非直接使用远程计算机,使存储介质对用户透明和可靠高效地传送数据。简单的说,FTP就是完成两台计算机之间的拷贝,从远程计算机拷贝文件至自己的计算机上或从自己计算机中拷贝至远程计算机上。在TCP/IP协议中,FTP标准命令TCP端口号为21,Port方式数据端口为20。
<2>网络文件传输原理
在通信的时候主要可以分为两个部分,一个部分是用于传送控制信息,例如发送文件的请求,文件的名称、大小等,采用MFC所提供的CSocket类的串行化技术来实现;而另一个部分就是文件的传输部分,对于文件的传输,由于数据量相对来说比较大,使用两个线程,一个用于发送,一个用于接收。这两个部分在具体实现的时候分别建立有自己的套接字。
<3>FTP传输原理
FTP协议使用两条单独的TCP连接,一条专用于发送FTP命令,另一条则专用于传递数据。初始建立连接时,服务器在21号端口上接收来自客户端的命令连接。当需要传送数据时(文件列表、文件数据等),客户端向服务器发出Port命令,并进入监听状态,等待来自服务器的数据连接请求。连接到FTP服务器,首先需要创建一个CInternetSession对象,用类CInterSession创建并初始化一个或几个同时存在的Internet会话,并描述与代理服务器的连接,如果在程序运行期间需要保持与Internet的连接,可以创建一个CInternetSession对象作为类CWinApp的成员。MFC中的类CFtpConnection管理与Internet服务器的连接,并直接操作服务器上的目录和文件,FTP是MFC的WinInet支持的三个Internet功能之一,创建一个CInternetSession实例和一个CFtpConnection对象就可以实现和一个FTP服务器通信,不需要直接创建CFtpConnection对象,而是通过调用CInternetSession::GetFtpConnection来完成这项工作。它创建CFtpConnection对象并返回一个指向该对象的指针。
三.方案设计
1、控件与变量的关联表:
DDX_Control(pDX, IDC_UPLOAD, m_btnUpload);
DDX_Control(pDX, IDC_DOWNLOAD, m_btnDownload);
DDX_Control(pDX, IDOK, m_btnQuery);
DDX_Control(pDX, IDC_LIST_FILE, m_listFile);
DDX_Control(pDX, IDC_EDIT_PWD, m_editPwd);
DDX_Control(pDX, IDC_EDIT_NAME, m_editName);
文件传输软件 网络文件传输
DDX_Control(pDX, IDC_EDIT_FTP, m_editFtp);
DDX_Text(pDX, IDC_EDIT_FTP, m_strFtp);
DDX_Text(pDX, IDC_EDIT_NAME, m_strName);
DDX_Text(pDX, IDC_EDIT_PWD, m_strPwd);
四.测试数据及运行结果
图一
图二
五.总结
网络编程FTP程序的实现,网络文件传输实验报告做的是,网络文件传输实验的实验报告,通过本次实验,我掌握了TCP协议和UDP协议实现文件传输的具体内容,也掌握了相关代码,发送端和接收端的相关知识,总之收获很多。(www.61k.com)
文件传输软件 网络文件传输
六.附录:源代码(电子版)
各个函数体代码:
void CFtpDlg::OnQuery() //查询的响应函数 {
针
pFileFind=new CFtpFileFind(pConnection); bContinue=pFileFind->FindFile("*"); // 查找服务器上当前目录的任意pConnection=pSession->GetFtpConnection(m_strFtp,m_strName,m_strP} catch (CInternetException* e) { } if (pConnection!=NULL) { // 创建CFtpFileFind对象,向构造函数传递CFtpConnection对象的指e->Delete(); // 无法建立连接,进行错误pConnection=NULL; wd); CInternetSession* pSession; //定义会话对象指针变量 CFtpConnection* pConnection; //定义连接对象指针变量 CFtpFileFind* pFileFind; //定义文件查询对象指针变量 CString strFileName; BOOL bContinue; pConnection=NULL; pFileFind=NULL; UpdateData(TRUE); // 获得用户的当前输入(服务器名,用户名和口while(m_listFile.GetCount()!=0) m_listFile.DeleteString(0); // 清除列表框pSession=new CInternetSession( // 创建Internet会话类对象 AfxGetAppName(),1,PRE_CONFIG_INTERNET_ACCESS); try { // 试图建立与指定FTP服务器的连接 令) 的内容 处理
文件传输软件 网络文件传输
文件
}
void CFtpDlg::OnDownload() //下载响应函数 { } delete pFileFind; // 删除文件查询对象 if (pConnection!=NULL) { } delete pSession; // 删除Internet 会话对象 pConnection->Close(); delete pConnection; // 删除FTP连接对象 if (!bContinue) // 如果一个文件都找不到,结束查找 { } while (bContinue) // 找到了第一个文件,继续找其它的文件 { } if (pFileFind!=NULL) { } pFileFind->Close(); // 结束查询 pFileFind=NULL; strFileName=pFileFind->GetFileName(); // 获得找到的文件的文// 如果找到的是否目录,将目录名放在括弧中 if (pFileFind->IsDirectory()) strFileName="["+strFileName+"]"; // 将找到的文件或目录名显示在列表框中。[www.61k.com) m_listFile.AddString(strFileName); bContinue=pFileFind->FindNextFile(); // 查找下一个文件 pFileFind->Close(); pFileFind=NULL; 件名
文件传输软件 网络文件传输
UpdateData(TRUE); CString strSourceName; //获得用户在列表框中的选择 nSel=m_listFile.GetCurSel(); m_listFile.GetText(nSel,strSourceName); if (strSourceName.GetAt(0)!='[' ) { } Else { //选择的是目录 AfxMessageBox("不能下载目录!请重选!",MB_OK|MB_ICONSTOP); //选择的是文件 CString strDestName; CFileDialog dlg(FALSE,"","*.*"); //定义了一个文件对话框对象变量 if (dlg.DoModal()==IDOK) //激活文件对话框 { } else { } AfxMessageBox("请写入文件名!",MB_OK|MB_ICONSTOP); //获得下载文件在本地机上存储的路径和名称 strDestName=dlg.GetPathName(); //调用函数下载文件 if (Download (strSourceName,strDestName)) AfxMessageBox("下载成功!",MB_OK|MB_ICONINFORMATION); else AfxMessageBox("下载失败!",MB_OK|MB_ICONSTOP);
文件传输软件 网络文件传输
}
//控件是否可用的处理
m_btnDownload.EnableWindow(FALSE);
m_btnUpload.EnableWindow(TRUE);
m_btnQuery.EnableWindow(TRUE);
m_editFtp.EnableWindow(TRUE);
m_editName.EnableWindow(TRUE);
m_editPwd.EnableWindow(TRUE);
m_staFtp.EnableWindow(TRUE);
m_staName.EnableWindow(TRUE);
m_staPwd.EnableWindow(TRUE);
}
BOOL CFtpDlg::Download(CString strSName, CString strDName) 函数
{
CInternetSession* pSession; //定义会话对象变量指针 CFtpConnection* pConnection; //定义连接对象变量指针
pConnection=NULL;
//创建Internet会话对象
pSession=new CInternetSession( AfxGetAppName(), 1, PRE_CONFIG_INTERNET_ACCESS);
try
{
//建立FTP连接
pConnection=pSession->GetFtpConnection(m_strFtp, m_strName, m_strPwd);
}
catch (CInternetException* e) //下载响应
文件传输软件 网络文件传输
}
{ } if (pConnection!=NULL) { } if (pConnection!=NULL) { } delete pSession; return TRUE; pConnection->Close(); delete pConnection; //下载文件 if (!pConnection->GetFile(strSName,strDName)) { } //下载文件错误 pConnection->Close(); delete pConnection; delete pSession; return FALSE; //错误处理 e->Delete(); pConnection=NULL; return FALSE;
void CFtpDlg::OnUpload() //上传响应函数 {
UpdateData(TRUE); //控件是否可用的处理 m_editFtp.EnableWindow(FALSE); //服务器域名输入文本框 m_editName.EnableWindow(FALSE); //登录客户名输入文本框
文件传输软件 网络文件传输
m_editPwd.EnableWindow(FALSE); //口令输入文本框 m_staFtp.EnableWindow(FALSE);
m_staName.EnableWindow(FALSE);
m_staPwd.EnableWindow(FALSE);
m_btnQuery.EnableWindow(FALSE);
CString strSourceName;
CString strDestName;
CFileDialog dlg(TRUE,"","*.*"); //定义文本对话框对象变量 if (dlg.DoModal()==IDOK)
{
//获得待上传的本地机文件路径和文件名
strSourceName=dlg.GetPathName();
strDestName=dlg.GetFileName();
//调用Upload函数上传文件
if (Upload (strSourceName,strDestName))
AfxMessageBox("上传成功",MB_OK|MB_ICONINFORMATION);
else
AfxMessageBox("上传失败!",MB_OK|MB_ICONSTOP); } else {
//文件选择有错误
AfxMessageBox("请选择文件!",MB_OK|MB_ICONSTOP); }
//控件是否可用的处理
m_btnQuery.EnableWindow(TRUE);
m_editFtp.EnableWindow(TRUE);
m_editName.EnableWindow(TRUE);
m_editPwd.EnableWindow(TRUE);
m_staFtp.EnableWindow(TRUE);
m_staName.EnableWindow(TRUE);
m_staPwd.EnableWindow(TRUE); !
文件传输软件 网络文件传输
}
二 : 我想问下,同一个局域网中,用IP如何实现文件传输的,请详细点讲。
文件传输
我想问下,同一个中,用IP如何实现文件传输的,请详细点讲。
电脑网络共享问题WINDOWS XP在局域网里使用网上邻居,进行电脑间的互访、共享文件传输和打印机共享的方法(其它系统类似)(全部要共享的电脑都要进行设置) 1、开通GUEST账号 (控制面板→用户账号→启用来宾账户GUEST) 2、设置在同一个工作组 (右击我的电脑→属性→计算机名→更改→工作组(需要重启)) 3、安装网络“服务”协议 (控制面板→网络连接→右击“本地连接”→属性→常规→直接点击“安装”→服务) 4、运行一次“设置家庭和小型办公网络” (控制面板→网络安装向导;或网上邻居→设置家庭和小型办公网络)--启用共享文件 5、共享要共享的文件或文件夹 (右击要共享文件夹,选“共享与安全”→勾选“在网络上共享这文件夹”;或者把要共享的文件,复制到共享文档里去) 6、共享打印机 (右击要共享的打印机,选“共享”→勾选“共享这台打印机”)连接好之后,在地址栏输入他的IP也可访问他共享的(就是本地连接属性里的IP) 在设置本地连接属性里的IP时,最好手动设置,不要自动获得。 点击网上邻居--察看工作组计算机,就可以看到了。 XP与Vista网络共享设置详解.
三 : 手把手教你实现局域网内两台WIN7快速传输文件
本文旨在教会读者实现局域网内两台WIN7电脑创建家庭组,实现互联,快速读取、传输文件。四 : 局域网文件传输和聊天系统
计 算 机 网 络
课
题目名称:
学生学院:
专业班级:
学 号:
学生姓名:
指导教师:
2012 年 程 设 计 局域网文件传输和聊天系统 6 月 21 日
局域网文件传输和聊天系统
摘要:本课程设计包含了文件传输协议的简单设计与实现和两人聊天系统的设计与实现。学会利用已有网络环境设计并实现简单应用层协议,掌握TCP/IP网络应用程序基本的设计方法和实现技巧,加深对客户/服务器的工作模式的认识。初步练习基于TCP/IP网络编程的基本实现方法和思路,同时进一步熟悉《计算机网络》课程中基于IP层协议的工作机制。
本设计完全用C语言编写,其中包括了具体设计任务,基本思路及所涉及的相关理论,设计流程图,调试过程中出现的问题及相应解决办法,核心程序,个人体会及建议等。
关键词:IP层协议,TCP/IP网络编程
1 具体设计任务
计算机网络实验环境建立在TCP/IP 网络体系结构之上。各计算机除了安装TCP/IP 软件外,还安装了TCP/IP 开发系统。实验室各计算机安装了VC++6.0,可对C语言进行编译,可为用户提供全网范围的进程通信功能。本实验要求利用这些功能,设计和实现一个简单的文件传送协议和两人聊天系统。
2基本思路及所涉及的相关理论
2.1基本思路
设计程序使客户端连接的时候,服务器将会向客户端发回一条消息告知它的IP地址,然后关闭连接并继续接收端口的连接。建立各个命令功能对应的函数,发送请求,等待服务器端的服务。服务器端确认IP地址,获取主机信息,并对客户端进行会话,发送回复讯息给客户端,响应完毕后关闭连接,释放。
2.2 相关理论
文件传送是各种计算机网络都实现的基本功能,文件传送协议是 1
一种最基本的应用层协议按照客户/服务器的模式进行工作,提供交互式的访问,是INTERNET使用最广泛的协议之一。
计算机网络实验环境建立在TCP/IP 网络体系结构之上。各计算机除了安装TCP/IP 软件外,还安装了TCP/IP 开发系统。实验室各计算机具备Windows环境中套接字socket 的编程接口功能,可为用户提供全网范围的进程通信功能。本设计利用这些功能,设计和实现一个简单的文件传送协议和两人聊天系统。用C语言可以简单的实现。
3 设计流程
图
2
4 部分截图
3
5 核心程序
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <Winsock2.h> #include <process.h> #include <time.h>
#pragma comment(lib,"Ws2_32") #define M 512000 #define portNum 8888
void LongToChar(long x,char a[]);
//每块传送文件的大小500k //使用的端口号 //将long型整数转换成字符串 4
long StrToLong(char str[]); //将字符串转换成long型整数
void getW_name(char waddr[],char wname[]); //获取文件名函数
void sendFile(SOCKET ss); //服务端发送文件函数
int receiveFile(SOCKET sc); //客户端接收文件函数
void chatting_client(SOCKET sc); //客户端聊天函数
void chatting_server(SOCKET s_d); //服务端聊天函数
int client(); //客户端主程序
void server(); //服务端主程序
void main()
{
system("cls");
system("@color 0a");
puts("\n");
puts("
*********************************************************"); puts(" * * ");
puts(" * 欢·迎·使·用·局·域·网·文·件·发·送·工·具 *"); puts(" * * ");
puts(" * * ");
puts(" * * ");
puts(" * 1. 客 户 端 * "); puts(" * * ");
puts(" * 2. 服 务 端 * "); puts(" * * ");
puts(" * 3. 结 束 * "); puts(" * * ");
puts(" * * ");
puts(" * 蓝天雄鹰 制作 * "); puts(" * 2012-6-20 * ");
puts(" * 蓝鹰展翅★气吞天下 * ");
puts("
*********************************************************\n"); puts("全屏(退出全屏)操作请按:ALT+ENTER\n");
printf("请输入你要选择的端代号(1-3):");
5
char ch;
char Num[10];
gets(Num);
ch=Num[0];
while(ch >='4' || ch <='0') //检测用户选择的代码是否符合要求
{
printf("\n你的输入有误!请重新输入:");
gets(Num);
ch=Num[0];
}
if('1'==ch)
{
client();
}
else if('2'==ch)
{
server();
}
else if('3'==ch)
{
exit(0);
}
}
int client()
{
system("color 0a"); //修改DOS窗口颜色,是其成0A。
WORD wVersion=MAKEWORD(1,1);
WSADATA wsData;
int nResult= WSAStartup(wVersion,&wsData); //启动WINSOCKET if(nResult !=0)
{
printf("启动Winsock失败!\n");
}
SOCKET sc=socket(AF_INET,SOCK_STREAM,IPPROTO_IP); //创建套接字 if(sc==INVALID_SOCKET)
{
6
printf("创建套接字失败!\n");
}
SOCKADDR_IN addrSc;
addrSc.sin_family=AF_INET;
addrSc.sin_port=htons(portNum); //保证字节顺序
char IP[20];
again:
printf("请输入服务器的IP地址:");
gets(IP);
if( -1==inet_addr(IP) ) //循环检测IP地址是否合法
{
printf("IP地址错误!\n");
goto again;
}
addrSc.sin_addr.S_un.S_addr=inet_addr(IP);
int b=0;
while(b<5) //检测5次,如果服务器在此时间内启动,则进行连接
{
nResult=connect(sc,(SOCKADDR*)&addrSc,sizeof(SOCKADDR)); //套接字连接
Sleep((DWORD)100); //延时1秒
if(nResult==SOCKET_ERROR)
{
printf(" %d 次连接失败!\n",b+1);
}
else
break;
b++;
}
if(nResult==SOCKET_ERROR)
{
printf("登陆超时,请重新登陆!\n");
goto again;
}
char *buf="连接成功!"; //向服务端验证连接成功 nResult=send(sc,buf,strlen(buf)+1,0);
if(nResult==SOCKET_ERROR)
{
printf("5.套接字发送数据失败!\n");
7
return 0;
}
char mess[M];
nResult =recv(sc,mess,strlen(mess),0); //接受服务端的连接验证信息
if(nResult == -1 ) //判断服务端是否关闭
{
printf("\n服务端已断开\n");
system("pause");
exit(0);
}
printf("%s\n",mess);
///////////////////////////////////////////////////////////////////////////
//// 功能菜单及操作 ////
///////////////////////////////////////////////////////////////////////////
tianle:
system("cls"); //清屏
puts("\n\n");
puts("
*********************************************************");
puts(" * * ");
puts(" * 欢·迎·使·用·局·域·网·文·件·发·送·工·具 *");
puts(" * (客 户 端) * ");
puts(" * * ");
puts(" * * ");
puts(" * 请等待服务端的相应操作 * ");
puts(" * * ");
puts(" * * ");
puts(" * 蓝天雄鹰 制作 * ");
puts(" * 2012-6-20 * ");
puts(" * 蓝鹰展翅★气吞天下 * ");
puts("
*********************************************************\n");
puts("全屏(退出全屏)操作请按:ALT+ENTER\n");
char rMess[100];
nResult=recv(sc,rMess,strlen(rMess),0); //接收服务端发来的操
作请求
if(nResult==-1) //判断服务端是否关闭
{
printf("\n服务端已断开\n");
system("pause");
8
goto tianle;
}
printf("%s\n",rMess);
char ch;
char str[100];
gets(str);
ch=str[0];
while( ch!='Y' && ch!='y' && ch!='N' && ch!='n' ) //处理客户端的错误输入
{
printf("输入有误,请重新输入(Y/N):");
gets(str);
ch=str[0];
}
send(sc,&ch,sizeof(char),0); //向服务端反馈选择,并执行相应操作
if(strcmp(rMess,"服务端向你传送文件,是否接受(Y/N):")==0 && (ch=='Y' || ch=='y') )
{
receiveFile(sc);
}
if(strcmp(rMess,"服务端向你发起聊天,是否接受(Y/N):")==0 && (ch=='Y' || ch=='y') )
{
chatting_client(sc);
}
if(ch=='N' || ch=='n')
{
printf("你拒绝了!\n");
system("pause");
}
system("cls");
goto tianle;
nResult=closesocket(sc); //关闭套接字
if(nResult==SOCKET_ERROR)
{
printf("8.关闭套接字失败!\n");
return 0;
}
}
void server()
9
{ system("color 0a"); //修改DOS窗口颜色为0A WORD wVersion=MAKEWORD(1,1); WSADATA wsData; int nResult= WSAStartup(wVersion,&wsData); //1、启动Winsock if(nResult !=0) { printf("启动Winsock失败!\n"); } SOCKET s=socket(AF_INET,SOCK_STREAM,IPPROTO_IP); //2.创建套接字 if(s==INVALID_SOCKET) { printf("创建套接字失败!\n"); } SOCKADDR_IN addr; addr.sin_family=AF_INET; addr.sin_port=htons(portNum); //保证字节顺序 addr.sin_addr.S_un.S_addr=htonl(INADDR_ANY); nResult=bind(s,(sockaddr*)&addr,sizeof(sockaddr)); //3、套接字的绑定 if(nResult==SOCKET_ERROR) { printf("套接字的绑定失败!\n"); } nResult=listen(s,5); //最多5个连接, 套接字的监听 if(nResult==SOCKET_ERROR) { printf("套接字的监听(服务器端)失败!\n"); } SOCKADDR_IN addrClient; int len=sizeof(SOCKADDR); printf("\n等待客户端的连接"); int a=0; while(a<5) { for(int b=0;b<8;b++) { Sleep(100); printf(" . "); //开始的一个小动态图形 10
}
Sleep(100);
system("cls");
printf("\n\r等待客户端的连接");
a++;
}
while(1)
{
SOCKET s_d=accept(s,(sockaddr*)&addrClient,&len); //5、套接字等待连接::
(服务器端)
if(s_d==INVALID_SOCKET)
{
printf("套接字等待连接(服务器端)失败!\n");
}
char *success="成功登陆服务器!";
send(s_d,success,strlen(success)+1,0); //向客户端发送验证信息
char mess[M];
nResult=recv(s_d,mess,strlen(mess),0);
if(nResult == -1 ) //判断服务端是否关闭
{
printf("\n客户端已断开\n");
system("pause");
exit(0);
}
printf("\n%s",mess);
///////////////////////////////////////////////////////////////////////////
//// 功能菜单及操作 ////
///////////////////////////////////////////////////////////////////////////
again:
system("@color 0a");
system("cls");
puts("\n");
puts("
*********************************************************");
puts(" * * ");
puts(" * 欢·迎·使·用·局·域·网·文·件·发·送·工·具 *");
puts(" * (服 务 端) * ");
puts(" * * ");
puts(" * * ");
puts(" * 1.向 客 户 端 传 送 文 件 * ");
puts(" * * ");
11
puts(" * 2.向 客 户 端 发 起 聊 天 * ");
puts(" * * ");
puts(" * 3.结 束 服 务 端 * ");
puts(" * * ");
puts(" * * ");
puts(" * 蓝天雄鹰 制作 * "); puts(" * 2012-6-20 * ");
puts(" * 蓝鹰展翅★气吞天下 * ");
puts("
*********************************************************\n"); puts("全屏(退出全屏)操作请按:ALT+ENTER\n");
printf("请输入你要选择的模块的代号(1-3):");
char ch;
char Num[10];
gets(Num);
ch=Num[0];
while(ch >='4' || ch <='0') //检测用户选择的代码是否符合要求
{
printf("\n你的输入有误!请重新输入:");
gets(Num);
ch=Num[0];
}
if('1'==ch) //发送文件模块的处理 {
char ch;
char *str="服务端向你传送文件,是否接受(Y/N):";
send(s_d,str,strlen(str)+1,0);
printf("等待客户端回应……\n");
nResult=recv(s_d,&ch,sizeof(char),0);
if(nResult == -1 ) //判断客户端是否关闭 {
printf("\n客户端已断开\n");
system("pause");
goto again;
}
if( ch=='Y' || ch=='y')
{
sendFile(s_d);
goto again;
}
if(ch=='N'|| ch=='n')
{
12
} } } printf("对方拒绝接受!\n"); system("pause"); goto again; if('2'==ch) //处理聊天模块 { char ch; int flag=0; char *str="服务端向你发起聊天,是否接受(Y/N):"; send(s_d,str,strlen(str)+1,0); printf("等待客户端回应……\n"); nResult=recv(s_d,&ch,sizeof(char),0); //判断客户端同意或不同意 if(nResult == -1 ) //判断客户端是否关闭 { printf("\n客户端已断开\n"); system("pause"); goto again; } if( ch=='Y' || ch=='y' ) { chatting_server(s_d); goto again; } if(ch=='N'|| ch=='n') { printf("对方拒绝接受!\n"); system("pause"); goto again; } } if('3'==ch) { exit(0); //结束程序 } nResult=closesocket(s); //关闭套接字。 if(nResult==SOCKET_ERROR) { printf("8.关闭套接字(服务器端)失败!\n"); 13
}
}
void chatting_client(SOCKET sc)
{
system("cls");
system("color 0a");
int receiveLength;
char SMess[1000]; //发送消息的缓存
char RMess[1000]; //接收消息的缓存
char SName[200]; //服务端用户的姓名
char CName[200]; //客户端用户的姓名
int nResult;
nResult=recv(sc,RMess,strlen(RMess),0); //确认文件传送模块连接成功 if( nResult== -1 ) //判断服务端是否关闭
{
printf("\n服务端已断开\n");
system("pause");
return ;
}
printf("%s\n",RMess);
printf("请输入你的名字:"); //客户端用户的姓名
gets(CName);
while(strlen(CName)==0)
{
printf("用户名不能为空! 请输入你的名字:\n");
gets(CName);
}
send(sc,CName,strlen(CName)+1,0); //向服务端发送姓名
receiveLength=recv(sc,SName,200,0); //接收服务端用户的姓名
if(receiveLength==-1) //判断服务端是否关闭
{
printf("\n服务端已断开\n");
system("pause");
return ;
}
printf("你已和%s取的连接……\n",SName);
printf("开始聊天(输入exit退出聊天程序)……\n");
while(1)
14
{
struct tm *local;
time_t t; //调用时间函数,显示用户的操作时间 t=time(NULL);
local=localtime(&t);
nResult=recv(sc,RMess,M,0); //接收服务端发送过来的消息 if(nResult == -1) //判断服务端是否关闭 {
printf("\n服务端已断开\n");
system("pause");
return ;
}
if(strcmp(RMess,"exit")==0)
{
printf("服务端已退出聊天程序,本程序也即将退出!\n"); system("pause");
break;
}
printf("%s\t%d:%d:%d
\n %s\n",SName,local->tm_hour,local->tm_min,local->tm_sec,RMess);
printf("\n请输入信息:"); //客户端用户输入消息
gets(SMess);
if(strcmp(SMess,"exit")==0)
{
send(sc,SMess,strlen(SMess)+1,0);
printf("你已退出聊天程序!\n");
system("pause");
break;
}
//服务端显示自己的消息
t=time(NULL);
local=localtime(&t);
printf("\r%s\t%d:%d:%d
\n %s\n",CName,local->tm_hour,local->tm_min,local->tm_sec,SMess); send(sc,SMess,strlen(SMess)+1,0);
}
}
void sendFile(SOCKET ss)
{
char *str1="....确认成功....";
send(ss,str1,strlen(str1)+1,0); //向客户端发送验证信息 15
FILE *fp;
long i; //文件分的的块数
char fileAddr[300];
char fileName[100];
dmm:
printf("请输入要传送的文件绝对地址(含文件名):");
gets(fileAddr);
if( (fp=fopen(fileAddr,"rb")) == NULL) //打开文件
{
printf("文件地址输入错误!\n");
goto dmm;
}
getW_name(fileAddr,fileName);
send(ss,fileName,strlen(fileName)+1,0); //发送文件名
fseek(fp,0L,2);
long fileLength=ftell(fp); //取得文件的长度
fseek(fp,0L,0);
char Length[100];
LongToChar(fileLength,Length);
send(ss,Length,strlen(Length)+1,0); //发送文件大小到客户端
if( 0 == fileLength%M ) //对文件进行分块
{
i=fileLength/M;
}
else
{
i=fileLength/M+1;
}
char mess[M];
long readLength; //从文件读取的长度
long sendLength; //发送文件的长度
int k=1; //正在传送的模块号
char *temp="开始接收文件"; //向客户端开始传送,确认同步开始 int nResult;
16
nResult=recv(ss,mess,M,0);
if(nResult == -1 ) //判断客户端是否关闭
{
printf("\n客户端已断开\n");
system("pause");
return ;
}
send(ss,temp,strlen(temp)+1,0);
printf("%s,共 %ld 模块:\n",mess,i);
long total=0;
while( k <= i )
{
Sleep((DWORD)800); //此非常重要,降低了传输时间,保证了两边的同步
readLength=fread(mess,sizeof(char),M,fp);
sendLength=send(ss,mess,readLength,0);
total+=sendLength;
printf("\r第 %d 模块 读取:%ldB 发送:%ldB",k,readLength,sendLength);
printf(" 进度: %2.2f%c 模块:%ld / %ld",100*(total*1.0/fileLength),37,k,i);
if(sendLength==SOCKET_ERROR)
{
printf("失败!");
}
k++;
}
fclose(fp);
printf("\n文件发送完成!\n");
system("pause");
}
void chatting_server(SOCKET s_d)
{
system("color 0a");
char *str1="你同意了……";
send(s_d,str1,strlen(str1)+1,0);
int receiveLength; //接收消息的长度
char SMess[1000]; //发送消息的缓存
char RMess[1000]; //接收消息的缓存
char SName[200]; //服务端用户的姓名
char CName[200]; //客户端用户的姓名
17
receiveLength=recv(s_d,CName,200,0);
if(receiveLength==-1) //判断客户端是否关闭
{
printf("客户端已断开\n");
system("pause");
return ;
}
printf("你已和%s取的连接……\n",CName);
printf("请输入你的名字:");
gets(SName);
while(strlen(SName)==0) //循环检测用户名是否合法
{
printf("用户名不能为空! 请输入你的名字:\n");
getchar();
gets(SName);
}
send(s_d,SName,strlen(SName)+1,0); //向客户端发送姓名
printf("\n开始聊天(输入exit退出聊天程序)……\n");
while(1)
{
struct tm *local;
time_t t;
t=time(NULL);
local=localtime(&t);
printf("\n\n请输入信息:");
gets(SMess);
if(strcmp(SMess,"exit")==0) //用户输入‘exit’退出程序
{
send(s_d,SMess,strlen(SMess)+1,0);
printf("你已退出聊天程序!\n");
system("pause");
break;
}
//在服务端显示自己的消息
printf("\r%s\t%d:%d:%d\n %s\n",SName,local->tm_hour,local->tm_min,local->tm_sec,SMess);
send(s_d,SMess,strlen(SMess)+1,0);
//在服务端显示客户端消息
18
t=time(NULL);
local=localtime(&t);
receiveLength=recv(s_d,RMess,M,0);
if(receiveLength==-1) //判断客户端是否关闭
{
printf("客户端已断开\n");
system("pause");
return ;
}
if(strcmp(RMess,"exit")==0)
{
printf("\n客户端已退出聊天程序,本程序也即将退出!\n"); system("pause");
break;
}
printf("\n%s\t%d:%d:%d\n %s\n",CName,local->tm_hour,local->tm_min,local->tm_sec,RMess);
}
}
void getW_name(char waddr[],char wname[])
{
int i,k=0,j,w_len=strlen(waddr);
for(i=w_len-1;i>=0;i--)
{
if(waddr[i]=='\\')
break;
wname[k++]=waddr[i];
}
wname[k++]='\0';
i=strlen(wname);
for(j=0,k=i-1;j<i/2;j++,k--)
{
char temp=wname[j];wname[j]=wname[k];wname[k]=temp;
}
}
int receiveFile(SOCKET sc)
{
system("color 0a");
int nResult;
char mess[M];
19
nResult=recv(sc,mess,strlen(mess),0); //确认文件传送模块连接成功 if(nResult == -1 ) //判断服务端是否关闭 { printf("\n服务端已断开\n"); system("pause"); return 0; } printf("%s\n",mess); char fileName[50]; nResult=recv(sc,fileName,50,0); //接收文件名 if(nResult == -1 ) //判断服务端是否关闭 { printf("\n服务端已断开\n"); system("pause"); return 0; } nResult=recv(sc,mess,M,0); //接受文件的大小 if(nResult == -1 ) //判断服务端是否关闭 { printf("\n服务端已断开\n"); system("pause"); return 0; } long fileLength=StrToLong(mess); //取的待传送文件的长度 long i; //存放文件块数 if( 0 == fileLength%M ) { i=fileLength/M; } else { i=fileLength/M+1; } //对文件按N单位进行分块 FILE *fp; int k=1; long receiveLength; long writeLength; fp=fopen(fileName,"wb"); //打开文件 //当前正在接收文件的块数 //接收文件的长度 //已写到文件的字符长度 20
char *temp="开始传送文件";
send(sc,temp,strlen(temp)+1,0); //向客户端开始传送,确认同步开始 nResult=recv(sc,mess,M,0); //接收服务端的确认消息
if(nResult == -1 ) //判断服务端是否关闭
{
printf("\n服务端已断开\n");
system("pause");
return 0;
}
printf("%s,共 %ld 模块:\n",mess,i);
long total=0; //已接收文件的长度
while(k<=i) //循环的接收文件
{
receiveLength=recv(sc,mess,M,0);
if( receiveLength== -1 ) //判断服务端是否关闭
{
printf("\n服务端已断开\n");
system("pause");
return 0;
}
writeLength=fwrite(mess,sizeof(char),receiveLength,fp);
printf("\r第 %d 模块 接收:
入:%ldB",k,receiveLength,writeLength);
total+=writeLength;
printf(" 进度: %2.2f%c 模
/ %ld",100*(total*1.0/fileLength),37,k,i);
k++;
}
fclose(fp);
printf("\n文件接收完成!\n");
system("pause");
return 0;
}
void LongToChar(long x,char a[])
{
int count=0;
if(x==0)
return;
21 %ldB 写块:%ld
while(x)
{
a[count++]=x%10+'0';
x=x/10;
}
a[count]='\0';
for(int i=0,j=count-1;i<count/2;i++,j--)
{ char temp;
temp=a[i];
a[i]=a[j];
a[j]=temp;}
}
long StrToLong(char str[])
{
long result;
bool bEnd;
bEnd = true;
result = 0;
for ( int i = 0; bEnd; i++ )
{
if (str[i] != '\0' && str[i] >= '0' && str[i] <= '9')
{
result = result * 10 + str[i] - '0';
}
if (str[i] == '\0')
{
bEnd = false;
}
}
return result;
}
6心得体会
通过本次实验,我对网络命令有了一定的概念性认识,并熟悉了基本网络命令的使用,通过计算机网课程设计的实践,了解了SOCKET编程相关的一些知识以及用法,了解了客户端和服务器端进行通信的相关算法机制,在建立通信的基础上,实现了一些简单的功能,更加熟悉了C语言的编程。限于自己的能力,对SOCKET编程 22
理解还不够透彻,还有待进一步的学习和实践以达到对网络的通信机制更深层次的理解。
参考文献
[1]陆魁军等编著.计算机网络基础实践教程.北京:清华大学出版社,2005.11
[2]谭浩强编著.C++程序设计.北京:清华大学出版社,2004,6
[3]谭浩强编著.C程序设计.北京:清华大学出版社,2005,7
[4]王洪涛编著.深入剖析Visual C++.北京:人民邮电出版社,2003,3
[5]陈良伦编著.网络工程概论.北京:机械工业出版社,2007,4 23
五 : 手把手教你实现局域网内两台WIN7快速传输文件
本文旨在教会读者实现局域网内两台WIN7电脑创建家庭组,实现互联,快速读取、传输文件。61阅读| 精彩专题| 最新文章| 热门文章| 苏ICP备13036349号-1