Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
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);
	}
 }

}