`

基于Socket的文件传输(使用CSocket类)

 
阅读更多

本软件使用MFC采用面向对象的方法实现了基于Socket的文件传输。这是原来研究生课程的结课作业,实现了Socket的发送和接收,以及读取ini配置文件等操作。使用了CSocket类

以下是当时结课作业的正文:

 

一.软件特点如下:

 

 

1.采用了多线程的方法,文件传输时使用AfxBeginThread()开启新线程

 

void CClientsockDlg::OnBnClickedSend()

{

pThreadSend = AfxBeginThread(Thread_Send,this);/

}

 

文件的发送和接收都开起了新线程

 

UINTThread_Send(LPVOID lpParam)

{

代码略

}

 

2.支持从配置文件configuration.ini中获取服务器参数

 

采用GetPrivateProfileString()GetPrivateProfileInt()分别获取位于ServerConfiguration.ini文件中的String类型的IPint类型的port

CString IP;

int port;

GetPrivateProfileString

(L"ServerConfiguration",L"IP",L"没有读取到数据!",IP.GetBuffer(10),10,L".\\configuration.ini");

port=GetPrivateProfileInt(L"ServerConfiguration",L"port",0,L".\\configuration.ini");

 

 

3.采用了面向对象的设计方式,功能之间按模块划分

MFC本身具有良好的面向对象的特性,本程序严格按照MFC框架结构编写代码,每个按钮对应一个功能函数,降低了代码之间的耦合性,有利于程序的扩展和复用。

 

void CServersockDlg::OnBnClickedChoose()

void CServersockDlg::OnBnClickedSend()

void CServersockDlg::OnBnClickedRecvdata()

void CServersockDlg::OnBnClickedAbout()

void CServersockDlg::OnBnClickedWriteini()

 

 

4.采用了CSocket类,代码相对更简单

CSocket类是MFC框架对socket编程中的winsockAPI的封装,因此通过这个类管理收发数据更加便利。代码也跟那个既简单易懂。

//创建

if(!Clientsock.Socket())

{

CString str;

str.Format(_T("Socket创建失败:%d"),GetLastError());

AfxMessageBox(str);

}

//连接

if(!Clientsock.Connect(IP,port))

{

CString str;

str.Format(_T("Socket连接失败:%d"),GetLastError());

AfxMessageBox(str);

}

else

{

AfxMessageBox(_T("Socket连接成功"));

代码略

//发送

while(nSize<FindFileData.nFileSizeLow)

{

szBuff = new char[1024];

memset(szBuff,0x00,1024);

nSend =file.Read(szBuff,1024);

Clientsock.Send(szBuff,nSend);//发送数据

nSize += nSend;

}

file.Close();

delete szBuff;

Clientsock.Close();

(dlg->GetDlgItem(IDC_SEND))->EnableWindow(TRUE);

AfxMessageBox(_T("文件发送成功"));

dlg->SetDlgItemTextW(IDC_FILEPATHNAME,_T(""));

}

return 0;

 

 

5.支持数据在服务器与客户端之间双向传输

 

本程序不但可以从客户端往服务器端传文件,而且可以从服务器端往客户端传文件。

但是互传文件的方式并不是完全相同的。

服务器端不管是接收文件还是发送文件始终是对绑定的端口进行监听。

//绑定

if(!Serversock.Bind(port))

{

CString str;

str.Format(_T("Socket绑定失败: %d"),GetLastError());

AfxMessageBox(str);

}

//监听

if(!Serversock.Listen(10))

{

CString str;

str.Format(_T("Socket监听失败:%d"),GetLastError());

AfxMessageBox(str);

}

 

 

客户端不管是接收文件还是发送文件始终是进行连接。

if(!Clientsock.Connect(IP,port))

{

CString str;

str.Format(_T("Socket连接失ì:%d"),GetLastError());

AfxMessageBox(str);

}

else

{

 

6.完全图形化操作界面

 

 

二.软件使用说明

 

客户端主界面如图所示:

 

u单击“选择文件”弹出文件对话框,选择一个要发送的文件,同时保存文件的路径。

u单击“发送”则会读取ServerConfiguration.ini文件中的配置信息(IPport),并根据此信息建立Socket连接,发送文件。注意:服务器端应该先单击了“接受客户端数据”,否则发送失败。

u单击“接收”也会读取ServerConfiguration.ini文件中的配置信息(IPport),并根据此信息建立Socket连接,接收文件。注意:服务器端应该先选择了向客户端发送的文件,并单击了“发送”,否则接受失败。

u单击“读取配置文件”,会从ServerConfiguration.ini文件中读取配置信息,并以可编辑的文本形式显示出来,修改完后,单击“写入配置文件”,会将修改后的信息保存到配置文件中。

u单击“关于”可以了解到软件相关信息。

u代码注释里有更详细的说明

服务器端主界面如图所示

 

u单击“接受客户端数据”,开始监听客户端的链接。

u 单击“选择文件”弹出文件对话框,选择一个要发送的文件,同时保存文件的路径。

u 单击“发送”则会读取ServerConfiguration.ini文件中的配置信息(port),并监听对应端口,准备发送文件。注意:客户端选择“接收”以后才能发送成功。

u 单击“读取配置文件”,会从ServerConfiguration.ini文件中读取配置信息,并以可编辑的文本形式显示出来,修改完后,单击“写入配置文件”,会将修改后的信息保存到配置文件中。但是服务器的IP是不可以修改的,它是在程序开始运行时从服务器所在机器的网卡上获取的。

u 单击“关于”可以了解到软件相关信息。

u 代码注释里有更详细的说明

 

 

 

 

代码下载地址:http://download.csdn.net/detail/leixiaohua1020/6320417

 

在此附上客户端使用CSocket发起连接的代码

//----------------------------发送文件的线程------------------------------
UINT Thread_Send(LPVOID lpParam)
{
	CClientsockDlg *dlg=(CClientsockDlg *)lpParam;
    (dlg->GetDlgItem(IDC_SEND))->EnableWindow(FALSE);

	CSocket Clientsock; //definition socket.
	if(!AfxSocketInit())
	{
		AfxMessageBox(IDP_SOCKETS_INIT_FAILED);
	}

	CString IP;
	int port;
	GetPrivateProfileString(L"ServerConfiguration",L"IP",L"没有读取到数据!",IP.GetBuffer(100),100,L".\\configuration.ini");
	port=GetPrivateProfileInt(L"ServerConfiguration",L"port",0,L".\\configuration.ini");
	//创建
	if(!Clientsock.Socket())
	{
		CString str;
		str.Format(_T("Socket创建失败: %d"),GetLastError());
		AfxMessageBox(str);
	}
	//连接
//	if(!Clientsock.Connect(_T("127.0.0.1"),8088))
	if(!Clientsock.Connect(IP,port))
	{
		CString str;
		str.Format(_T("Socket连接失败: %d"),GetLastError());
		AfxMessageBox(str);
	}
	else
	{
		AfxMessageBox(_T("Socket连接成功"));
		WIN32_FIND_DATA FindFileData;
		CString strPathName; //定义用来保存发送文件路径的CString对象
		dlg->GetDlgItemTextW(IDC_FILEPATHNAME,strPathName);
		FindClose(FindFirstFile(strPathName,&FindFileData));
		Clientsock.Send(&FindFileData,sizeof(WIN32_FIND_DATA));
        
		CFile file;
		if(!file.Open(strPathName,CFile::modeRead|CFile::typeBinary))
		{
			AfxMessageBox(_T("文件不存在"));
			return 1;
		}

		UINT nSize = 0;
		UINT nSend = 0;

		char *szBuff=NULL;
	//发送
		while(nSize<FindFileData.nFileSizeLow)
		{
            szBuff = new char[1024];
			memset(szBuff,0x00,1024);
			nSend = file.Read(szBuff,1024);
			Clientsock.Send(szBuff,nSend);//发送数据
			nSize += nSend;
		}
		file.Close();
		delete szBuff;
		Clientsock.Close();
		(dlg->GetDlgItem(IDC_SEND))->EnableWindow(TRUE);
		AfxMessageBox(_T("文件发送成功"));
		dlg->SetDlgItemTextW(IDC_FILEPATHNAME,_T(""));
	}
	return 0;
}

 

以及服务器端使用CSocket监听的代码:

//----------------------------监听文件的线程------------------------------
UINT Thread_Func(LPVOID lpParam)  //接收文件的线程函数
{
	CServersockDlg *dlg = (CServersockDlg *)lpParam; //获取对话框指针
    (dlg->GetDlgItem(IDC_RECVDATA))->EnableWindow(FALSE);

	if(!AfxSocketInit())
	{
		AfxMessageBox(IDP_SOCKETS_INIT_FAILED);
	}

	CString IP;
	int port;
	GetPrivateProfileString(L"ServerConfiguration",L"IP",L"没有读取到数据!",IP.GetBuffer(100),100,L".\\configuration.ini");
	port=GetPrivateProfileInt(L"ServerConfiguration",L"port",0,L".\\configuration.ini");
    
	char errBuf[100]={0};// 临时缓存
    
	SYSTEMTIME t; //系统时间结构 

	CFile logErrorfile;
	if(!logErrorfile.Open(_T("logErrorfile.txt"),CFile::modeCreate|CFile::modeReadWrite))
	{
		return 1;
	}

	CSocket Serversock;
    CSocket Clientsock;
	//创建
	if(!Serversock.Socket())
	{
		CString str;
		str.Format(_T("Socket创建失败: %d"),GetLastError());
		AfxMessageBox(str);
	}

	BOOL bOptVal = TRUE;
	int bOptLen = sizeof(BOOL);
	Serversock.SetSockOpt(SO_REUSEADDR,(void *)&bOptVal,bOptLen,SOL_SOCKET);

	//绑定
	if(!Serversock.Bind(port))
	{
		CString str;
		str.Format(_T("Socket绑定失败: %d"),GetLastError());
		AfxMessageBox(str);
	}
    //监听 
	if(!Serversock.Listen(10))
	{
		CString str;
		str.Format(_T("Socket监听失败: %d"),GetLastError());
		AfxMessageBox(str);
	}

	GetLocalTime(&t);
	sprintf_s(errBuf,"服务器已经启动...正在等待接收文件...\r\n时间:%d年%d月%d日 %2d:%2d:%2d \r\n",t.wYear,t.wMonth,t.wDay,
		t.wHour,t.wMinute,t.wSecond);
	int len = strlen(errBuf);
	logErrorfile.Write(errBuf,len);
	AfxMessageBox(_T("启动成功等待接收文件"));
	while(1)
	{
		//AfxMessageBox(_T("服务器启动成功..."));
		if(!Serversock.Accept(Clientsock)) //等待接收 
		{
			continue;
		}
		else
		{
			WIN32_FIND_DATA FileInfo;
			Clientsock.Receive(&FileInfo,sizeof(WIN32_FIND_DATA));

			CFile file;
			file.Open(FileInfo.cFileName,CFile::modeCreate|CFile::modeWrite);
			//AfxMessageBox(FileInfo.cFileName);
			int length = sizeof(FileInfo.cFileName);
			logErrorfile.Write(FileInfo.cFileName,length);
			//Receive文件的数据

			UINT nSize = 0;
			UINT nData = 0;

			char *szBuff=NULL;

			while(nSize<FileInfo.nFileSizeLow)
			{
				szBuff = new char[1024];
				memset(szBuff,0x00,1024);
				nData=Clientsock.Receive(szBuff,1024);
			    file.Write(szBuff,nData);
				nSize+=nData;
			}

			delete szBuff;
			Serversock.Close();
			Clientsock.Close();
			file.Close();
			(dlg->GetDlgItem(IDC_RECVDATA))->EnableWindow(TRUE);
			sprintf_s(errBuf,"文件接收成功...\r\n时间:%d年%d月%d日 %2d:%2d:%2d \r\n",t.wYear,t.wMonth,t.wDay,
		t.wHour,t.wMinute,t.wSecond);
			int len = strlen(errBuf);
			logErrorfile.Write(errBuf,len);
			//AfxMessageBox(_T("文件接收成功..."));
		    break;
		}
	}
	return 0;
}

 

 

分享到:
评论

相关推荐

    FileTransfer_demo.zip_CSocket文件传输_csocket_csocket 文件_socket_传输文件

    本文将深入探讨标题"FileTransfer_demo.zip_CSocket文件传输_csocket_csocket 文件_socket_传输文件"所涉及的核心知识点,包括CSocket类的使用,文件传输的原理以及如何通过socket接口来实现实时的文件传输。...

    基于MFC 的Socket类的多线程文件传输

    在“基于MFC的Socket类的多线程文件传输”项目中,"TranFileServer"可能是一个服务器端应用程序,它使用CSocket类创建监听套接字,等待客户端的连接请求。一旦连接建立,服务器端会开启一个新的线程来处理每个客户端...

    使用CSocket类进行文件传输

    本篇文章将详细探讨如何使用`CSocket`类进行文件传输,以及相关的编程步骤和技术要点。 **一、CSocket类的基本概念** `CSocket`是MFC对Winsock API的面向对象包装,它简化了网络编程的过程。`CSocket`提供了连接、...

    基于CSocket的文件传输小软件

    文件传输是软件的主要功能,这里使用了CSocket类来实现TCP连接,TCP是一种面向连接的、可靠的传输协议,适合文件的大规模传输。CSocket类负责建立连接、发送数据和接收数据。软件的界面设计使得用户可以方便地选择...

    基于CSocket点对点文件传输

    本文将深入探讨如何利用Microsoft Visual C++ 6.0(简称VC6.0)中的CSocket类实现一个简单的点对点文件传输程序。 **一、CSocket类简介** CSocket是MFC(Microsoft Foundation Classes)库中的一个类,它是Windows ...

    基于VS2010的CSocket网络文件传输

    在本文中,我们将深入探讨如何使用Visual Studio 2010(VS2010)中的CSocket类进行网络文件传输。CSocket是MFC(Microsoft Foundation Classes)库中的一个关键组件,它提供了对Winsock API的封装,使得C++程序员...

    UDP通讯软件CSocket类

    使用CSocket类,开发者可以方便地创建和管理socket,进行数据发送和接收,适合于构建基于UDP协议的应用程序。 在这个压缩包文件“MySocket”中,可能包含以下内容: 1. 源代码文件:这些文件通常以`.cpp`和`.h`为...

    CSocket文件传输

    CSocket文件传输是一种基于Windows Socket API(也称为Winsock)的编程技术,用于在客户端和服务器之间进行数据传输。在本场景中,我们讨论的是一个实现了客户端-服务器模型的文件传输程序,它利用了CSocket类,这是...

    MFC CSocket Demo 传输文件 基于VC6.0

    本示例基于VC6.0,展示了如何使用MFC CSocket来实现简单的文件传输功能。 首先,我们需要了解TCP的基本工作原理。TCP通过三次握手建立连接,然后双方可以进行数据交换,最后通过四次挥手断开连接。TCP保证了数据的...

    CSocket进行文件传输

    在计算机网络编程中,CSocket是MFC(Microsoft Foundation Classes)库中提供的一个类,用于实现基于套接字的通信。...这些知识点构成了基于CSocket的大文件传输系统的基础,对于理解和实现这类应用至关重要。

    C++ Csocket实现文件传输协议

    本篇文章将深入探讨如何使用C++中的Csocket库来实现一个简单的文件传输协议,以便客户端和服务器之间能够交换数据。 首先,我们需要理解Socket的基本概念。Socket是操作系统提供的一种进程间通信(IPC)机制,特别...

    CSocket类的几篇期刊文章

    CSocket类是Microsoft Visual C++ MFC库中的一个关键组件,用于实现基于Socket的网络通信。它是对Windows Sockets API的封装,简化了C++程序员进行网络编程的难度。在这个主题中,我们将深入探讨如何利用CSocket类在...

    基于CSocket的聊天室

    【标题】"基于CSocket的聊天室"是一个利用MFC中的CSocket类构建的简易聊天应用程序,主要用于教学或课程设计目的。在这个项目中,开发者使用了Microsoft Visual C++ 6.0作为集成开发环境,并在Windows XP操作系统上...

    Csocket文件传输源码

    "Csocket文件传输源码"是一个基于C++实现的简单文件传输程序,它利用了Socket接口进行数据交换,允许用户通过网络发送和接收TXT文本文件。本文将深入探讨相关知识点,包括Socket编程基础、文件传输原理以及如何通过...

    利用Visual C++的CSocket类实现局域网聊天

    2. **创建Server Socket**:使用`CSocket`的派生类创建服务器端套接字,通常命名为CServerSocket,并重载`OnAccept`函数来处理新连接。 3. **绑定和监听**:调用`Bind`函数将套接字与特定端口关联,然后调用`Listen...

    MFC Socket 文件传输器

    在MFC中,使用`CSocket`类来创建Socket对象。首先,服务器端创建一个监听Socket,通过调用`Create()`函数初始化,并使用`Listen()`函数设置监听状态。当客户端尝试连接时,服务器调用`Accept()`函数来接收连接请求...

    VC++编写的基于CSocket类的聊天程序代码

    在本文中,我们将深入探讨如何使用Microsoft Visual C++(VC++)开发一个基于`CSocket`类的聊天程序。这个程序包含两个主要组件:客户端(ChatClient)和服务器端(ChatServer),它们通过网络进行通信。`CSocket`类...

    CSocket MFC 传递文件

    通过上述步骤,我们可以实现使用MFC的`CSocket`类进行文件传输。这个过程中涉及到了网络编程基础、MFC对象模型、数据流操作以及错误处理等多个方面,是MFC网络编程中一个典型的实战案例。理解并掌握这些知识点对于...

    CSocket发送接受长文件的例子

    在Windows编程环境中,`CSocket` 是MFC(Microsoft Foundation Classes)库中提供的一种网络通信类,它基于Berkeley Sockets API,简化了Socket编程。本示例将深入讲解如何使用`CSocket`来发送和接收长文件。首先,...

    利用CSocket类轻松实现C/S通讯

    CSocket类是Microsoft Foundation Class (MFC) 库提供的一种简化套接字编程的工具,它基于Windows Socket API(Winsock)进行封装,使得程序员可以更方便地创建网络应用程序。 首先,我们需要了解CSocket类的基本...

Global site tag (gtag.js) - Google Analytics