远程软件升级(http协议)
来源:互联网 发布:mac如何截取视频 编辑:程序博客网 时间:2024/06/06 00:49
远程软件升级
第一次接触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:%s\a\n",strerror(errno));
exit(-1);
}
if(connect(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1)
{
fprintf(stderr,"Connect Error:%s\a\n",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.1\r\nAccept: */*\r\nAccept-Language: zh-cn\r\n\
User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)\r\n\
Host: %s:%d\r\nConnection: Close\r\n\r\n", host_file, host_addr, portnumber);
printf("%s", request);/*准备request,将要发送给主机*/
User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)\r\n\
Host: %s:%d\r\nConnection: Close\r\n\r\n", 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时存盘一次*/
}
}
{
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]); //重启父进程
kill(getppid(),SIGKILL); //kill父进程
system(mvlib); //将升级包转移到'/lib'下
system(argv[2]); //重启父进程
我自己参考网上一些牛人的程序模拟了一个http协议的服务器,和软件升级的模拟,各种测试已通过,如有需要请留言。
大致的程序流程已经写完,拍砖请留言。
0 0
- 远程软件升级(http协议)
- 升级HTTP/2协议
- 基于TFTP协议的远程升级设计
- ATMEGA128单片机的软件远程升级
- ATMEGA128单片机的软件远程升级(转)
- 软件体系结构和HTTP协议
- 基于http协议的在线升级系统
- iOS9升级后退回HTTP协议
- HTTP协议详解--出自“小坦克”blog(软件测试)
- Xcode升级之后Http协议改为Https协议
- http协议分析软件-Fiddler 教程
- HTTP协议笔记(二):HTTP协议
- Xmodem 协议封装,用于字库编码下载,软件升级
- HTTP协议(一)
- http协议(二)
- http协议(下)
- HTTP协议(收藏)
- HTTP协议(转)
- Could not evaluate Expression' Debugger Abnormality in Visual Studio 2013 '
- 分布式搜索elasticsearch java API 之(四)------删除索引数据
- myeclipse中的项目层结构怎么设置为树形
- ZOJ1002
- 第2章 循环结构程序设计
- 远程软件升级(http协议)
- combiner操作
- Ubuntu12.04下Android4.0.4源码的下载及其编译过程
- Java NIO 系列教程
- 两元店经典台词
- 移植tiny210 的lcd驱动
- 递归求平均数代码
- 【C语言天天练(十七)】字符/字符串输出函数fputc、fputs、putc、putchar和puts
- GetMemory错误讲解(指针练习)