`
rcfalcon
  • 浏览: 227983 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

一个基于socket的资源共享平台的实现(四)

阅读更多

现在我们的整个系统基本可用了,还缺少什么?

—— 客户端自动升级。

 

当我们把整个系统部署下去之后,如果打补丁、升级版本等,都需要让用户重新下载的话,肯定用户会觉得很厌烦。

所以我们应该要开发一个loader,客户端能够自动检测更新、升级,并可以在服务器端打包升级流及升级流信息下发。

 

在此系统中,我直接是服务器下发一条升级信息(带版本号),然后与客户端当前版本号进行配对,若高于客户端,则开始客户端更新升级。

这里由于我们的客户端很小,所以我直接将客户端exe通过TCP传输下来。客户端接收完毕之后,自我关闭,换成更新过的exe启动。

 

这里有个小伎俩,一个exe程序如何升级自身?

当时我上网找了许多,都觉得太麻烦,于是自己想了一个“歪门邪道”,不过真的很好用,这里跟大家分享一下。

 

假设我们正在运行的客户端程序叫做 1.exe,我们通过TCP拿到的升级后的程序叫做 2.exe。

我们此时需要在1.exe中将自身结束,将2.exe改名成1.exe并且启动它。问题就出在这一步,既然已经把自己都结束了,如何去讲2.exe改名和启动呢?

 

——通过bat。

 

我们在1.exe运行过程中动态创建一个批处理文件,其干以下事情:

 

start:

若存在1.exe ,删除之,若删除不了,返回start;

将2.exe改名为1.exe;

启动1.exe;

将自己删掉;

 

注意最后在1.exe中我们需要异步启动bat(很显然,不然死循环了),这样就可以实现我们所说的功能啦。

 

部分代码如下:

 

void CNetShareDlg::UpDateClient(char* Buffer)
{
	wchar_t* pVer = NetShareIndexManager::AnsiToUnicode(Buffer + 2);
	CString Version(pVer);
	delete pVer;
	NSConfig con = ObjCfg.Get();
	string s1( Buffer + 2);

	char* p = NetShareIndexManager::UnicodeToAnsi(con.Version);
	string s2(p);
	delete p;

	if( s1 != s2 && gDownloadingBusy == false ) //版本不相同,启动自动升级
	{
		//发送从服务器下载信息
		string sendbuffer;
		sendbuffer.push_back(NS_UDP_CLIENT_GETEXE);
		sendbuffer.push_back('\n');
		SendToServer(sendbuffer);

		//从服务器下载文件
		gDownloadingBusy = true;
		cpplib::resource::MutexLock MyMutex(FileDownloadMutex);
		TCP_Client::Instance()->SetFileSize(gDownloadingFileSize);
		TCP_Client::Instance()->GetFile("update.dat",TCP_TRANCESPORT_PORT);

		//自杀,重启
		KillTimer(TIME_EVENT_LIVING);//不再发送心跳包
		AfxMessageBox(_T("自动更新成功,将启动新版本"));

		//获取自身文件名
		TCHAR filename[1024];
		::GetModuleFileName( NULL, filename, 1024 );
		CString str( filename );
		int pos = str.ReverseFind(_T('\\'));
		CString MyFileName = str.Mid(pos + 1,str.GetLength() - pos);

		char* p = NetShareIndexManager::UnicodeToAnsi(MyFileName.GetBuffer(0));

		//建立更新批处理文件
		FILE *fp; 
		fp = fopen( "update.bat" , "w+" ); 
		fprintf( fp , "@echo off\n" ); 
		fprintf( fp , ":begin\n" ); 
		fprintf( fp , "del %s\n", p ); 
		fprintf( fp , "if exist %s goto begin\n", p ); 
		fprintf( fp , "copy update.dat %s\n", p ); 
		fprintf( fp , "del update.dat\n" ); 
		fprintf( fp , "start %s\n", p );
		fprintf( fp , "del %%0%%\n");
		fclose(fp); 

		delete p;

		con.Version = Version;
		ObjCfg.Save( con );//保存新版本号
		WinExec("update.bat",SW_SHOW);
		gDownloadingBusy = false;
		exit(0);
	}
}

 

 

最后看看我们的丑陋的MFC下的界面

 

 

 

 

分享到:
评论

相关推荐

    基于socket的文件传输

    总的来说,这个项目提供了一个基础的Socket文件传输模型,通过实践可以加深对Java网络编程的理解,为构建更复杂的应用,如聊天室、文件共享系统等打下坚实基础。对于开发者来说,熟练掌握Socket编程不仅可以增强解决...

    Linux上实现基于Socket_的多进程实时通信

    在Linux系统中,实现基于Socket的多进程实时通信是一项重要的技术,它允许不同的进程间高效地交换数据。本文将详细介绍如何创建一个通信服务器(server)来作为中介,处理多个客户端(client)的连接和通信请求。 ...

    用基于Socket做的类似资源管理器的文件共享

    本项目“用基于Socket做的类似资源管理器的文件共享”旨在创建一个简易的文件共享系统,其设计灵感来源于Windows资源管理器,使用户能够方便地进行文件的上传和下载,同时在操作过程中提供进度显示。 首先,Socket...

    QT实现的基于TCP Socket的共享白板.7z

    在本项目中,“QT实现的基于TCP Socket的共享白板”是一个利用QT库构建的、通过TCP Socket进行通信的多人协作工具。下面将详细介绍QT库、TCP Socket以及共享白板的相关知识点。 1. QT库: - QT库提供了一整套的C++...

    基于Socket的IPC消息平台设计

    基于Socket的IPC消息平台为进程间通信提供了一个灵活、高效且易于集成的解决方案。通过线程池、消息队列和消息传输通道等关键技术的应用,不仅提高了系统的性能和吞吐量,还实现了真正的跨平台和跨语言特性,极大地...

    Linux下基于socket多线程并发通信的实现

    总结来说,Linux下的多线程并发通信基于socket实现,结合TCP/IP协议,能够高效地处理多个客户端的并发请求。开发者需要理解套接字的概念、类型以及编程原理,同时掌握多线程编程技巧,包括线程安全、线程池等,以...

    基于SOCKET和多线程的应用程序间通信技术的研究.pdf

    基于SOCKET和多线程的应用程序间通信技术,不仅可以实现跨平台的数据通信,还能在保证数据准确性和完整性的同时,提高系统的响应速度和处理能力。通过对多线程的合理利用,可以有效地分配系统资源,优化数据处理流程...

    基于Socket的多用户网络游戏

    本项目“基于Socket的多用户网络游戏”是一个典型的利用Socket实现的多人在线交互游戏,以井字游戏(Tic-Tac-Toe)为例,展示了如何通过网络连接让多个玩家在同一平台上进行实时对战。 首先,我们要理解什么是...

    Linux下用Socket和多线程实现简单聊天室

    - **线程概念**:线程是进程中的一个执行流,同一进程内的多个线程可以并发执行,共享进程资源,提高程序并发性能。 - **创建线程**:在Linux中,可以使用`pthread_create()`函数创建新的线程,传入线程函数指针和...

    Java基于Socket文件传输示例

    Java基于Socket文件传输示例是一种常见的网络编程应用场景,主要用于实现两个网络节点间的文件共享和交换。Socket编程是Java网络通信的基础,它提供了低级别的、面向连接的、双向的数据传输通道。在这个示例中,我们...

    SOCKET实现远程算术运算(简洁经典实用)

    综合以上,这个项目通过运用SOCKET实现网络通信,利用多线程提升并发处理能力,结合非阻塞模式确保服务的实时性,以及使用STL优化数据管理和算法执行,构建了一个高效且实用的远程算术运算系统。对于想要学习网络...

    Android 基于Socket 的IPC通信

    以上就是基于Socket的Android IPC通信的基本原理和实现步骤。通过这种方式,不同Android进程可以相互通信,实现复杂的功能,例如文件传输、实时消息推送等。但需要注意的是,Socket通信可能会消耗较多的系统资源,...

    C#多线程与Socket聊天室的实现

    本文将深入探讨如何使用C#语言实现一个基于TCP/IP协议的多线程Socket聊天室。这个聊天室功能允许局域网内的多台计算机进行实时信息交互,虽然没有在广域网环境下测试,但在局域网内能有效工作。 首先,我们要理解...

    LabVIEW环境下远程资源共享及Dat Socket实现

    【LabVIEW环境下的远程资源共享与DataSocket实现】 虚拟仪器技术,以其灵活性和用户自定义性,正在逐步替代传统的硬件仪器。随着互联网的普及,虚拟仪器的网络化趋势日益凸显,LabVIEW作为虚拟仪器的重要开发平台,...

    应用SOCKET实现网络通信

    SOCKET编程中,创建SOCKET后需要绑定一个IP地址和端口号,端口号可以唯一标识网络中的一个进程,IP地址则用于标识不同计算机之间的通信。在基于Windows平台的SOCKET编程中,通常会使用Winsock(Windows Sockets)API...

    基于socket聊天工具

    总结来说,这个基于Socket的聊天工具项目涵盖了网络编程的核心概念,如TCP/IP协议、Socket接口、即时通讯实现、文件传输机制和屏幕截图共享。同时,由于提供了源代码,它对于开发者而言,是一个实践和学习网络编程的...

    基于socket并发网络通信

    在IT行业中,网络通信是计算机科学的一个重要领域,特别是在分布式系统和互联网应用中。Socket编程是一种基础且核心的技术,它提供了进程间通信(IPC)的能力,使得运行在不同机器上的程序能够相互通信。本篇将详细...

    Python Tornado实现WEB服务器Socket服务器共存并实现交互的方法

    要实现Web服务器和Socket服务器之间的通信,你可以创建一个共享的数据结构,如全局变量或队列,两者都可以访问。例如,Web服务器接收到一个HTTP请求,处理后将数据放入队列,Socket服务器定期检查队列并发送数据给...

    基于Socket的java网络编程

    Java网络编程的核心是基于Socket进行通信,Socket是TCP/IP协议栈的一种实现,它允许两个网络节点(通常是客户端和服务器)通过TCP或UDP进行数据交换。Socket接口为应用程序提供了低级别的网络通信控制,允许开发者...

Global site tag (gtag.js) - Google Analytics