#include "./update_server.h"
//initialize
void CODEC_InitUpdateList(void) {
cout<<"++CODEC_InitUpdateList()"<<endl;
memset(&dev_update_record_list, 0, sizeof(dev_update_record_list));
}
void Codec_PrintUpdateList(void) {
cout<<"++Codec_PrintUpdateList()"<<endl;
int i;
cout<<" Num \t DevType \t DevID \t DevIP \t LastUpdateTime"<<endl;
for(i=0; i<MAX_DEV_NUM_UPDATE; i++) {
if( 0 == dev_update_record_list[i].DevType
|| -1 == dev_update_record_list[i].DevID
|| 0 == strlen(dev_update_record_list[i].DevIP) ) {
continue;
} else {
cout<<"\t"
<<i<<" \t "
<<dev_update_record_list[i].DevType<<" \t "
<<dev_update_record_list[i].DevID<<" \t "
<<dev_update_record_list[i].DevIP<<" \t "
<<dev_update_record_list[i].UpdateTime.wYear<<"/"
<<dev_update_record_list[i].UpdateTime.wMonth<<"/"
<<dev_update_record_list[i].UpdateTime.wDay<<" "
<<dev_update_record_list[i].UpdateTime.wHour<<":"
<<dev_update_record_list[i].UpdateTime.wMinute<<":"
<<dev_update_record_list[i].UpdateTime.wSecond
<<endl;
}
}
}
//find device by (DevType, DevID) or DevIP, if failure return -1
int CODEC_FindInUpdateList(unsigned int DevType, int DevID, char *DevIP) {
cout<<"++CODEC_FindInUpdateList()"<<endl;
int i;
int index;
index = -1;
if (0 == DevType || -1 == DevID) { //find device by IP
if (DevIP != NULL) {
for(i=0; i<MAX_DEV_NUM_UPDATE; i++) {
if(0 == strcmp(dev_update_record_list[i].DevIP, DevIP)) {
index = i;
break;
}
}
}
} else { //find device by DevType and DevID
for(i=0; i<MAX_DEV_NUM_UPDATE; i++) {
if (dev_update_record_list[i].DevType==DevType
&& dev_update_record_list[i].DevID==DevID ) {
index = i;
break;
}
}
}
return index;
}
//add device, if failure return -1
int CODEC_AddToUpdateList(unsigned int DevType, int DevID, char *DevIP) {
cout<<"++CODEC_AddToUpdateList()"<<endl;
int i;
int index;
index = -1;
for(i=0; i<MAX_DEV_NUM_UPDATE; i++) {
if ( 0 == dev_update_record_list[i].DevType
|| -1 == dev_update_record_list[i].DevID
|| 0 == strlen(dev_update_record_list[i].DevIP)) {
dev_update_record_list[i].DevType = DevType;
dev_update_record_list[i].DevID = DevID;
strcpy(dev_update_record_list[i].DevIP, DevIP);
index = i;
update_list_num++;
break;
}
}
return index;
}
//delete device, if failure return -1
int CODEC_DelFromUpdateList(unsigned int DevType, int DevID, char *DevIP) {
cout<<"++CODEC_DelFromUpdateList()"<<endl;
int index;
//find device
index = CODEC_FindInUpdateList(DevType, DevID, DevIP);
if (index != -1) {
memset(&dev_update_record_list[index], 0, sizeof(DevUpdateRecStruct));
update_list_num--;
}
return index;
}
//升级服务器,等待客户连接
//收到请求信号后,发送update文件,客户端接收文件并覆盖
int CODEC_UpdateServer(void) {
cout<<"++CODEC_UpdateServer() start"<<endl;
// variable
sockaddr_in local;
SOCKET lisnskt;
bool on = true;
fd_set rset,tempset;
unsigned int maxfd;
int nready;
SOCKET connskt;
SOCKET tempskt;
SOCKET client[MAX_DEV_NUM_UPDATE];
int client_num = 0;
int i;
int maxi;
sockaddr_in from;
int fromlen;
int bytesRecv=0;
int bytesSend;
DevUpdatePktStruct update_pkt;
int fh;
int bytesRead;
char rBuf[MAX_DATA_BUF_LEN_UPDATE];
int index = -1;
WSADATA wsaData;
//WSAStartup initializes the program for calling WinSock.
//The first parameter specifies the highest version of the
//WinSock specification, the program is allowed to use.
int wsaret=WSAStartup(MAKEWORD(2, 0),&wsaData);
//WSAStartup returns zero on success, If it fails we exit.
if(wsaret!=0) {
printf("WSAStartup error!\n");
return FAILURE;
}
//Now we populate the sockaddr_in structure
memset(&local,0,sizeof(sockaddr_in));
local.sin_family=AF_INET;
local.sin_addr.s_addr=INADDR_ANY;
local.sin_port=htons(Codec_Update_Server_Port);
//create a socket
lisnskt=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(lisnskt==INVALID_SOCKET) {
printf("create listen socket error!\n");
return FAILURE;
}
//bind socket with server address(IP and port)
if(bind(lisnskt,(sockaddr*)&local,sizeof(local))!=0) {
printf("bind listen socket error!");
closesocket(lisnskt);
return FAILURE;
}
setsockopt(lisnskt, SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof(on));
//listen socket if there is any connection request,
//we can accept MAX_CONNECT_NUM connections coinstantaneous
if(listen(lisnskt,MAX_DEV_NUM_UPDATE)!=0) {
printf("Error listening on socket.\n");
closesocket(lisnskt);
return FAILURE;
}
cout<<"Waiting for client to connect..."<<endl;
maxfd = lisnskt; //initialize
maxi = -1; //index to client[] array
for(i=0; i<MAX_DEV_NUM_UPDATE; i++) { //-1 indicates available entry
client[i] = 0;
}
FD_ZERO(&rset);
FD_SET(lisnskt,&rset);
while(!Update_Server_Off) {
tempset=rset;
nready=select(maxfd+1,&tempset,NULL,NULL,NULL);
if(nready == SOCKET_ERROR) {
cout<<"server select error, quiting..."<<endl;
continue;
}
//new client connection
if(FD_ISSET(lisnskt,&tempset)) {
fromlen=sizeof(from);
connskt=accept(lisnskt, (struct sockaddr*)&from, &fromlen);
cout<<"\nnew client: connection from "<<inet_ntoa(from.sin_addr)<<endl;
client_num++;
if(client_num > MAX_DEV_NUM_UPDATE) {
cout<<"too many client, ignore this client!"<<endl;
closesocket(connskt);
client_num = MAX_DEV_NUM_UPDATE;
} else {
// save descriptor
for(i=0; i<MAX_DEV_NUM_UPDATE; i++) {
if(client[i] <= 0) {
client[i]=connskt;
break;
}
}
FD_SET(connskt, &rset); //add new descriptor to set
if(connskt > maxfd) maxfd = connskt;
if(i > maxi) maxi = i;
}
if (--nready <= 0) continue;
}
for(i=0; i<=maxi; i++) {
if ( (tempskt=client[i]) <= 0 ) continue;
if(FD_ISSET(tempskt, &tempset) ) {
bytesRecv=recv(tempskt, (char *)&update_pkt, sizeof(DevUpdatePktStruct), 0);
if(bytesRecv == 0 || bytesRecv == SOCKET_ERROR) { //connection error
cout<<"client off line detected."<<endl;
closesocket(tempskt);
FD_CLR(tempskt, &rset);
client[i] = 0;
client_num--;
} else {
//parse the packet
//if "Request_Update", do update process
if ( 0 == strcmp(update_pkt.CmdHint, "Request_Update") ) {
cout<<"Request_Update recved..."<<endl;
//send File_Name
cout<<"File_Name send..."<<endl;
memset(update_pkt.CmdHint, 0, sizeof(update_pkt.CmdHint));
strcpy(update_pkt.CmdHint, "File_Name");
memset(update_pkt.DataBuf, 0, sizeof(update_pkt.DataBuf));
strcpy(update_pkt.DataBuf, UpDate_File_Name);
bytesSend = send(tempskt, (char *)&update_pkt, sizeof(DevUpdatePktStruct), 0);
if(bytesSend == SOCKET_ERROR ) {
cout<<"send error"<<endl;
closesocket(tempskt);
FD_CLR(tempskt, &rset);
client[i] = 0;
client_num--;
continue;
//goto nready_judge;
}
//send File_Begin, notify client to prepare for recv file content
cout<<"File_Begin send..."<<endl;
memset(update_pkt.CmdHint, 0, sizeof(update_pkt.CmdHint));
strcpy(update_pkt.CmdHint, "File_Begin");
memset(update_pkt.DataBuf, 0, sizeof(update_pkt.DataBuf));
strcpy(update_pkt.DataBuf, UpDate_File_Name);
bytesSend = send(tempskt, (char *)&update_pkt, sizeof(DevUpdatePktStruct), 0);
if(bytesSend == SOCKET_ERROR ) {
cout<<"send error"<<endl;
closesocket(tempskt);
FD_CLR(tempskt, &rset);
client[i] = 0;
client_num--;
continue;
//goto nready_judge;
}
//open update f
没有合适的资源?快使用搜索试试~ 我知道了~
updata_server.rar_linux 升级_updata serv_updata server_www.updata.
共4个文件
h:2个
txt:1个
cpp:1个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 102 浏览量
2022-09-23
06:39:56
上传
评论
收藏 5KB RAR 举报
温馨提示
一个简单的服务器升级更新程序,网络编程入门的可以看看,很有参考价值
资源推荐
资源详情
资源评论
收起资源包目录
updata_server.rar (4个子文件)
updata_server
codec_update.h 755B
update_server.cpp 11KB
update_server.h 1KB
www.pudn.com.txt 218B
共 4 条
- 1
资源评论
邓凌佳
- 粉丝: 65
- 资源: 1万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功