int ProcessGetCommand(LPPER_HANDLE_DATA PerHandleData, LPPER_IO_OPERATION_DATA PerIoData) { // get command: get [filename] char *beginFile = PerIoData->cmdBuffer + 3; while (*beginFile == '\t' || *beginFile == ' ') *beginFile++; char *filename = PerIoData->cmdBuffer + (beginFile-PerIoData->cmdBuffer); int isfile = issubFileOrDir(PerHandleData->strCurrentWorkPath, ANSIToUnicode(filename)); if (isfile == 1) { return 1; } else if (isfile == 2) { char tmpFullFilename[100] = { 0 }; sprintf_s(tmpFullFilename, "%s\\%s", UnicodeToANSI(PerHandleData->strCurrentWorkPath), filename); int sendSuccess = FileSend(PerHandleData->socket, tmpFullFilename); if (sendSuccess != TRAN_SUCCESS) { cout << "Send file " << filename << " failed.\n"; return -1; } return 2; } else { cout << "file " << filename << " is not existed.\n"; return -1; } return -1; }
void SeverSocket(void) { SOCKET sockSrv; //服务器套接字号 SOCKADDR_IN addrClient; //连接上的客户端ip地址 int len=sizeof(SOCKADDR); //SOCKADDR结构体大小 int flag=0; //存储接收到的STB消息类型 FILE * fpReadIn=NULL; // 文件指针 unsigned char sendbuffer[BUF_SIZE]; //发送缓冲区 unsigned char*pfile_buf=NULL; //存储文件的缓冲区指针 unsigned long file_len=0; //文件长度 int send_len=0; //发送的数据长度 int ver_len=0; //版本数据的长度(最大19个字节) ReadFileAble=READFILE; //文件标识置为“正在读入” pfile_buf = ( unsigned char *) malloc (FLIE_BUFFER_SIZE); if(pfile_buf==NULL) { LogDisplay("内存分配失败!\r\n"); return; } if(ReadFileProcess( &ver_len, pfile_buf, &file_len,fpReadIn )<0) return; sockSrv=Socket_Init(); //服务器sokcet连接初始化 LogDisplay("监听STB连接请求\r\n\r\n"); if(( listen(sockSrv,20))!=0) { sprintf(Print_Buf,"监听失败!%d\r\n", WSAGetLastError()); LogDisplay(Print_Buf); closesocket(sockSrv); free(pfile_buf); return ; } while(1) { LogDisplay("等待STB连接!waiting...\r\n"); memset(sendbuffer,0,sizeof(sendbuffer)); ReadFileAble=WAITACCEPT; //文件标识置为“等待连接” if(QuerySocketReadble( sockSrv,&ver_len,pfile_buf,&file_len,fpReadIn)<0) { free(pfile_buf); return; } SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);// 接受客户端连接,获取客户端的ip地址 if(sockConn==INVALID_SOCKET) { sprintf(Print_Buf,"accept无效连接!%d \r\n",WSAGetLastError()); LogDisplay(Print_Buf); continue; } ReadFileAble=CONNECTING; //发送数据期间无法读入文件 LogDisplay("收到STB连接请求!\r\n"); sprintf(Print_Buf,"发送升级流版本号:%s \r\n",Ver_Buf); LogDisplay(Print_Buf); Ver_Buf[ver_len]=ver_len+1; //在Ver_buf最后填写总的数据长度(包括最后一位) if((send_len=send(sockConn,(char*)Ver_Buf,ver_len+1,0))<0) { LogDisplay("版本号发送失败!\r\n"); closesocket(sockConn); //断开连接 closesocket(sockSrv); free(pfile_buf); return ; } Ver_Buf[ver_len]=0; //解决发送一次后版本号尾部乱码问题 LogDisplay("等待STB确认信息...\r\n"); flag=Receive_StbInfo(sockConn); if(flag==CLOSED_ID) { LogDisplay("机顶盒程序版本已经最新\r\n"); LogDisplay("释放连接\r\n\r\n"); closesocket(sockConn); continue; } if(flag<0) { LogDisplay("接受STB信息失败!\r\n"); LogDisplay("释放连接\r\n\r\n"); closesocket(sockConn); continue; } /***************发送文件,接受STB消息*****************/ flag=0; flag=FileSend(pfile_buf,file_len,sockConn); if(flag==RESEND_ID) { LogDisplay("释放连接\r\n\r\n"); closesocket(sockConn); } if(flag==CLOSED_ID) { LogDisplay("机顶盒端接收完毕\r\n"); LogDisplay("释放连接\r\n\r\n"); closesocket(sockConn); } if(flag<0) { LogDisplay("连接错误,释放连接\r\n\r\n"); closesocket(sockConn); } } }