远程软件升级
第一次接触http协议软件升级方面的编程,以下是本人的学习过程,希望对读者有帮助。 需要的参考文献有:设计自动升级软件、linux下的webserver_BOA及CGIC库的使用指南 读者需要在要作为服务器的系统上安装boa服务器,根据“linux下的webserver_BOA及CGIC库的使用指南”可以成功安装完成boa服务器。服务器安装完成后,就是升级程序的编写了。升级程序的主要功能是做为客户端请求boa服务器上的升级包(升级包要放在服务器下,收到请求后在发给客户端即升级程序端)、接收升级包、关闭要升级的软件、替换/lib下的库文件、重启升级完成后的软件。
读者要做的主要工作就是升级程序的编写(客户端),下面是升级程序的实现过程: 1、建立tcp连接: /* 客户程序发起连接请求 */
if(connect(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1)
{
fprintf(stderr,”Connect Error:%san”,strerror(errno));
exit(-1);
} 连接的ip为boa服务器的ip,端口为boa服务器http协议的监听端口,一般默认是80端口,在配置boa服务器的时候可以在配置文件boa.config修改端口。 2、连接成功后,向boa服务器发送请求: send = write(sockfd, request + totalsend, nbytes – totalsend); request指向的请求字符串必须是http协议的请求格式,如下: sprintf(request, “GET %s HTTP/1.1rnAccept: */*rnAccept-Language: zh-cnrn
User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)rn
Host: %s:%drnConnection: Closernrn”, host_file, host_addr, portnumber);
printf(“%s”, request);/*准备request,将要发送给主机*/ 3、接收boa服务器的返回数据也就是升级包了,boa服务器的返回还是http协议的数据,接收完成后需要按照http协议解析才能得到正确的升级包,解析代码如下: while((nbytes=read(sockfd,buffer,1))==1) //接收boa服务器返回的数据
{
if(i < 4) {
if(buffer[0] == ‘r’ || buffer[0] == ‘n’) i++;
else i = 0;
printf(“%c”, buffer[0]);/*把http头信息打印在屏幕上*/
}
else {
fwrite(buffer, 1, 1, fp);/*将http主体信息写入文件*/
i++;
if(i%1024 == 0) fflush(fp);/*每1K时存盘一次*/
}
} 4、被升级软件的关闭、升级包的替换、升级后软件的重启如下(我的升级程序是作为被升级软件的一个子进程,所以可以用以下的方式): sprintf(mvlib,”mv %s /lib/”,local_file);
kill(getppid(),SIGKILL); //kill父进程
system(mvlib); //将升级包转移到’/lib’下
system(argv[2]); //重启父进程
我自己参考 上一些牛人的程序模拟了一个http协议的服务器,和软件升级的模拟,各种测试已通过,如有需要请留言。 大致的程序流程已经写完,拍砖请留言。
文章知识点与官方知识档案匹配,可进一步学习相关知识 络技能树首页概览22106 人正在系统学习中
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!