码迷,mamicode.com
首页 > 其他好文 > 详细

自动更新系统(三)

时间:2015-01-05 21:58:47      阅读:274      评论:0      收藏:0      [点我收藏+]

标签:c语言   嵌入式   解决方案   tcp   源代码   

客户端的程序

这个程序的功能现在基本是可以实现了,但是不能实现MISRA C的检测,有很多的小红帽,贴出来,希望有知道怎么改的大神不吝赐教。
message.cpp的代码:
#include "message.h"

/***************************************************************************
*不能用字符串函数,用4字节存长度时,里面会有0,而字符串函数会把它当作结束符
*不用uchar,就算是负数(超过127),接收那边复原 
***************************************************************************/

CHAR *PackMessage(
				  const MSGE *ptmessage
				 )

{
	  CHAR *pcmessage = NULL;
	  UINT32 ui32index = 0u, ui32length = 0u, ui32i = 0u;
	  ULONG_64 ui32temp = 0u;
	  /*文件名字长度占一个字节*/
	  ui32length = strlen(ptmessage->FileName) + strlen(ptmessage->FileContent);
	  ui32length += (2u * sizeof(UINT32)) + 1u;
      pcmessage = (CHAR *)calloc(1u, ui32length + 4u); 

	   /*消息头*/
	   ui32temp = htonl((ULONG_64)ui32length);
	   (void)memcpy_s(pcmessage, ui32length + 4u, &ui32temp, 4u);

	   /*文件名字字节数*/
	   ui32index += 4u;
	   pcmessage[ui32index] = (CHAR)strlen(ptmessage->FileName);

	   /*文件名*/
	   ui32index += 1u;
	   (void)memcpy_s(&pcmessage[ui32index], ui32length + 4u, ptmessage->FileName, strlen(ptmessage->FileName));

	   /*偏移量*/
	  ui32temp = htonl(ptmessage->OffSet);
	  ui32index += strlen(ptmessage->FileName);
      memcpy(&pcmessage[ui32index], &ui32temp, 4u);

	  /*块大小*/
	  ui32temp = htonl(ptmessage->BlockLength);
      ui32index += 4u;
	  memcpy(&pcmessage[ui32index], &ui32temp, 4u);  

	  /*文件块内容*/
	  ui32index += 4u;
	  memcpy(&pcmessage[ui32index], ptmessage->FileContent, strlen(ptmessage->FileContent)); 

	  return (pcmessage);
}


/*可能还需要一个参数,关于传进数组的大小,限制数组是某种格式*/
MSGE *UnpackMessage(
					const CHAR acmessage[]
				   )

{
	MSGE *ptmessage = NULL;
	UINT32 ui32index = 0u, ui32length = 0u, ui32i = 0u;

	ptmessage = (MSGE *)calloc(1, sizeof(MSGE));

	memcpy((CHAR *)&ui32length, acmessage, 4u);
	ui32length =ntohl(ui32length);

	ui32index += 5;
	memcpy(ptmessage->FileName, &acmessage[ui32index], acmessage[4]);

	ui32index += acmessage[4];
	memcpy((CHAR *)&ptmessage->OffSet, &acmessage[ui32index], 4u);
	ptmessage->OffSet = ntohl(ptmessage->OffSet);

	ui32index += 4;
	memcpy((CHAR *)&ptmessage->BlockLength, &acmessage[ui32index], 4u);
	ptmessage->BlockLength = ntohl(ptmessage->BlockLength);


	ui32index += 4;
//	if(acmessage[ui32index] != 0)  注意二进制
    memcpy(ptmessage->FileContent, &acmessage[ui32index], ui32length-acmessage[4] - 9);

	return (ptmessage);

}


INT32 TransmitFile(
				   SOCKET sock, 
				   CHAR acfilename[],
				   UINT32 ui32filesize
				  )

{
	FILE *fp = NULL;
	MSGE *ptmsg = NULL, *ptrevmsg = NULL;
	MSGE tmessage = {0};
	CHAR *pcsendData = NULL, acrevData[CONTENTMAX + 50] = {0};  //不能用PACKETMAX替换255,会出问题,至少为201+31+13
	CHAR acfiledct[100] = "C:\\";
	CHAR acfolderdct[100] = "C:\\";
	INT32 i32loading=0, i32temp = -1, i32sendret = 0;
	UINT32 ui32ret = 0u, ui32remain = 0u, ui32num = 0u;
	UINT32 ui32i = 0u, ui32j = 0u, ui32k = 0u, ui32h = 0u;
	
	ptmsg = &tmessage;
	strcpy(ptmsg->FileName, acfilename);

	/***************************************************************************
	*路径与文件名分离
	***************************************************************************/
	ui32j = strlen(acfilename) - 1;
	while(acfilename[ui32j] != '\\')
	{
		ui32j--;
	}
	ui32h = strlen(acfolderdct);
	for(ui32k = ui32h; ui32k < ui32j + ui32h; ui32k++)
	{
		acfolderdct[ui32k] = acfilename[ui32k-ui32h];
	}
	mkdir(acfolderdct);


	strcat(acfiledct, acfilename);
	fp = fopen(acfiledct, "wb");  //注意:要用二进制打开,不然有问题
	if (NULL == fp)
	{
		(void)OSM_Printf("error\n");
	}

	ui32num = ui32filesize / CONTENTMAX;
	ui32remain = ui32filesize % CONTENTMAX;

    

#if 0
	ui32j = strlen(acfilename) - 1;
	while(acfilename[ui32j] != '\\')
	{
		ui32j--;
	}

	while(acfilename[ui32j] != '\0')
	{
		acfilename[ui32k] = acfilename[ui32j+1];
		ui32k++;
		ui32j++;
	}
#endif

	(void)OSM_Printf("%s:\n下载倒计时..",acfilename);
    while (1)
    {
		if (ui32i!=ui32num)
		{
			ptmsg->OffSet = ui32i * CONTENTMAX;
			ptmsg->BlockLength = CONTENTMAX;
		}
		else
		{    
			if (0u == ui32i)
			{
				ptmsg->OffSet = 0u;
			}
			else 
			{
				ptmsg->OffSet += CONTENTMAX;
			}

			ptmsg->BlockLength = ui32remain;
		}
	
		pcsendData = PackMessage(ptmsg);  //因为含有0,调试框会显示不完全
		i32sendret = send(sock, pcsendData, (pcsendData[4] + 13), 0);  //sendData[4]为文件名字长度
		if (i32sendret != ((INT32)pcsendData[4] + 13))
		{ 
			(void)OSM_Printf("发送错误\n");
		}

	    (void)OSM_Free(pcsendData);
          
		ui32ret = recv(sock,acrevData, strlen(ptmsg->FileName) + (INT32)ptmsg->BlockLength + 13, 0);  

		if (ui32ret != strlen(ptmsg->FileName) + ptmsg->BlockLength + 13u)
		{
			(void)OSM_Printf("接收错误\n"); 
		}

		if(ui32ret > 0)
		{
			i32loading = (ui32num - ui32i) / 800;
			if(i32loading != i32temp)
			{
				i32temp = (ui32num-ui32i) / 800;
				(void)OSM_Printf("%d..", i32loading);
			}

			acrevData[ui32ret] = '\0';
            ptrevmsg = UnpackMessage(acrevData);

				
			//fseek(fp,ptrevmsg->OffSet,0);
			(void)fwrite(ptrevmsg->FileContent, ptrevmsg->BlockLength, 1u, fp);
			     

			if (ptrevmsg != NULL)
			{
				(void)OSM_Free(ptrevmsg);
			}
			ui32ret = 0;
		}

		ui32i++;
		if ((ui32i == (ui32num + 1)) || ((ui32i == ui32num) && (0 == ui32remain )))
		{
			break;
		}
     }

	(void)fclose(fp);
	(void)OSM_Printf("\n下载完\n");
	return (SUCCESS);
}



void DeleteFile(
				const CHAR acfilename[]
			   )

{
	CHAR DeleteDir[100] = "C:\\";


	strcat(DeleteDir, acfilename);
	OSM_Printf("删除了%s\n",DeleteDir);
	remove(DeleteDir);

}



CHAR *PacksMessage(
				   const LNode *ptmessage
				  )

{
	CHAR *pcmessage = NULL;
	UINT32 ui32index = 0u, ui32length = 0u, ui32temp = 0u, ui32i = 0u;

	/*文件名字长度占一个字节*/
	ui32length = strlen(ptmessage->FILE_NAME) + strlen(ptmessage->SHA1) + 2 * sizeof(UINT32);
	pcmessage = (CHAR *)calloc(1, ui32length + 4u); 

	/*消息头 总长度*/
	ui32temp = htonl(ui32length);
	memcpy(pcmessage, (CHAR *)&ui32temp, 4u);


	/*文件名字字符串大小*/
	ui32temp = htonl(strlen(ptmessage->FILE_NAME));
	ui32index += 4;
	memcpy(&pcmessage[ui32index], (CHAR *)&ui32temp, 4u);

	/*文件名字*/
	ui32index += 4;
	memcpy(&pcmessage[ui32index], ptmessage->FILE_NAME, strlen(ptmessage->FILE_NAME));

	/*sha1*/

	ui32index += strlen(ptmessage->FILE_NAME);
	memcpy(&pcmessage[ui32index], ptmessage->SHA1, strlen(ptmessage->SHA1));

	/*文件大小*/
	ui32temp = htonl(ptmessage->FILESIZE);
	ui32index += strlen(ptmessage->SHA1);
	memcpy(&pcmessage[ui32index], (CHAR *)&ui32temp, 4u);  

	return (pcmessage);
}


/*可能还需要一个参数,关于传进数组的大小,限制数组是某种格式*/
LNode *UnpacksMessage(
					  const CHAR acmessage[]
					 )

{
	LNode *ptmessage = NULL;
	UINT32 ui32index = 0u, ui32length = 0u, ui32i = 0u;
	UINT32 filename_size = 0u;
	ptmessage = (LNode *)calloc(1, sizeof(LNode));

	/*取消息头*/
	memcpy((CHAR *)&ui32length, acmessage, 4u);
	ui32length =ntohl(ui32length);

	/*取文件名字总大小*/
	ui32index += 4;
	memcpy((CHAR *)&filename_size, &acmessage[ui32index], 4u);
	filename_size = ntohl(filename_size);

	/*取文件名字*/
	ui32index += 4;
	memcpy(ptmessage->FILE_NAME, &acmessage[ui32index], filename_size);

	/*取sha1*/
	ui32index += filename_size;
	memcpy((CHAR *)&ptmessage->SHA1, &acmessage[ui32index], ui32length-filename_size-8);

	/*取文件大小*/
	ui32index += ui32length-filename_size-8;
	memcpy((CHAR *)&ptmessage->FILESIZE, &acmessage[ui32index], 4u);
	ptmessage->FILESIZE = ntohl(ptmessage->FILESIZE);

	return (ptmessage);
}
SHA1的代码:
#include "list.h"

INT32 mnuSearch_i32OSM = 0;

void  sha1_init(
				SHA1_CONTEXT *hd
			   )

{  
	hd->h0 = 0x67452301U;  
	hd->h1 = 0xefcdab89U;  
	hd->h2 = 0x98badcfeU;  
	hd->h3 = 0x10325476U;  
	hd->h4 = 0xc3d2e1f0U;  
	hd->nblocks = 0U;  
	hd->count = 0;  
}  


/**************** 
* Transform the message X which consists of 16 32-bit-words 
*/  
static void  transform(
					   SHA1_CONTEXT *hd,
					   const UINT8 *data
					  )

{  
	UINT32 a,b,c,d,e,tm;  
	UINT32 x[16];  

	/* get values from the chaining vars */  
	a = hd->h0;  
	b = hd->h1;  
	c = hd->h2;  
	d = hd->h3;  
	e = hd->h4;  

#ifdef BIG_ENDIAN_HOST  
	memcpy( x, data, 64 );  
#else  
	{  
		INT32 i;  
		UINT8 *p2;  
		for(i=0, p2=(UINT8*)x; i < 16; i++, p2 += 4 )   
		{  
			p2[3] = *data++;  
			p2[2] = *data++;  
			p2[1] = *data++;  
			p2[0] = *data++;  
		}  
	}  
#endif  

	R( a, b, c, d, e, F1, K1, x[ 0] );  
	R( e, a, b, c, d, F1, K1, x[ 1] );  
	R( d, e, a, b, c, F1, K1, x[ 2] );  
	R( c, d, e, a, b, F1, K1, x[ 3] );  
	R( b, c, d, e, a, F1, K1, x[ 4] );  
	R( a, b, c, d, e, F1, K1, x[ 5] );  
	R( e, a, b, c, d, F1, K1, x[ 6] );  
	R( d, e, a, b, c, F1, K1, x[ 7] );  
	R( c, d, e, a, b, F1, K1, x[ 8] );  
	R( b, c, d, e, a, F1, K1, x[ 9] );  
	R( a, b, c, d, e, F1, K1, x[10] );  
	R( e, a, b, c, d, F1, K1, x[11] );  
	R( d, e, a, b, c, F1, K1, x[12] );  
	R( c, d, e, a, b, F1, K1, x[13] );  
	R( b, c, d, e, a, F1, K1, x[14] );  
	R( a, b, c, d, e, F1, K1, x[15] );  
	R( e, a, b, c, d, F1, K1, M(16) );  
	R( d, e, a, b, c, F1, K1, M(17) );  
	R( c, d, e, a, b, F1, K1, M(18) );  
	R( b, c, d, e, a, F1, K1, M(19) );  
	R( a, b, c, d, e, F2, K2, M(20) );  
	R( e, a, b, c, d, F2, K2, M(21) );  
	R( d, e, a, b, c, F2, K2, M(22) );  
	R( c, d, e, a, b, F2, K2, M(23) );  
	R( b, c, d, e, a, F2, K2, M(24) );  
	R( a, b, c, d, e, F2, K2, M(25) );  
	R( e, a, b, c, d, F2, K2, M(26) );  
	R( d, e, a, b, c, F2, K2, M(27) );  
	R( c, d, e, a, b, F2, K2, M(28) );  
	R( b, c, d, e, a, F2, K2, M(29) );  
	R( a, b, c, d, e, F2, K2, M(30) );  
	R( e, a, b, c, d, F2, K2, M(31) );  
	R( d, e, a, b, c, F2, K2, M(32) );  
	R( c, d, e, a, b, F2, K2, M(33) );  
	R( b, c, d, e, a, F2, K2, M(34) );  
	R( a, b, c, d, e, F2, K2, M(35) );  
	R( e, a, b, c, d, F2, K2, M(36) );  
	R( d, e, a, b, c, F2, K2, M(37) );  
	R( c, d, e, a, b, F2, K2, M(38) );  
	R( b, c, d, e, a, F2, K2, M(39) );  
	R( a, b, c, d, e, F3, K3, M(40) );  
	R( e, a, b, c, d, F3, K3, M(41) );  
	R( d, e, a, b, c, F3, K3, M(42) );  
	R( c, d, e, a, b, F3, K3, M(43) );  
	R( b, c, d, e, a, F3, K3, M(44) );  
	R( a, b, c, d, e, F3, K3, M(45) );  
	R( e, a, b, c, d, F3, K3, M(46) );  
	R( d, e, a, b, c, F3, K3, M(47) );  
	R( c, d, e, a, b, F3, K3, M(48) );  
	R( b, c, d, e, a, F3, K3, M(49) );  
	R( a, b, c, d, e, F3, K3, M(50) );  
	R( e, a, b, c, d, F3, K3, M(51) );  
	R( d, e, a, b, c, F3, K3, M(52) );  
	R( c, d, e, a, b, F3, K3, M(53) );  
	R( b, c, d, e, a, F3, K3, M(54) );  
	R( a, b, c, d, e, F3, K3, M(55) );  
	R( e, a, b, c, d, F3, K3, M(56) );  
	R( d, e, a, b, c, F3, K3, M(57) );  
	R( c, d, e, a, b, F3, K3, M(58) );  
	R( b, c, d, e, a, F3, K3, M(59) );  
	R( a, b, c, d, e, F4, K4, M(60) );  
	R( e, a, b, c, d, F4, K4, M(61) );  
	R( d, e, a, b, c, F4, K4, M(62) );  
	R( c, d, e, a, b, F4, K4, M(63) );  
	R( b, c, d, e, a, F4, K4, M(64) );  
	R( a, b, c, d, e, F4, K4, M(65) );  
	R( e, a, b, c, d, F4, K4, M(66) );  
	R( d, e, a, b, c, F4, K4, M(67) );  
	R( c, d, e, a, b, F4, K4, M(68) );  
	R( b, c, d, e, a, F4, K4, M(69) );  
	R( a, b, c, d, e, F4, K4, M(70) );  
	R( e, a, b, c, d, F4, K4, M(71) );  
	R( d, e, a, b, c, F4, K4, M(72) );  
	R( c, d, e, a, b, F4, K4, M(73) );  
	R( b, c, d, e, a, F4, K4, M(74) );  
	R( a, b, c, d, e, F4, K4, M(75) );  
	R( e, a, b, c, d, F4, K4, M(76) );  
	R( d, e, a, b, c, F4, K4, M(77) );  
	R( c, d, e, a, b, F4, K4, M(78) );  
	R( b, c, d, e, a, F4, K4, M(79) );  

	/* Update chaining vars */  
	hd->h0 += a;  
	hd->h1 += b;  
	hd->h2 += c;  
	hd->h3 += d;  
	hd->h4 += e;  
}  


/* Update the message digest with the contents 
* of INBUF with length INLEN. 
*/  
static void  sha1_write(
						SHA1_CONTEXT *hd,
						const UINT8 *inbuf,
						UINT32 inlen
					   )

{  
	if( hd->count == 64 )		/* flush the buffer */  
	{ 
		transform( hd, hd->buf );  
		hd->count = 0;  
		hd->nblocks++;  
	}  
	if( !inbuf  )  
		return;  
	if( hd->count ) 
	{  
		for( ; (inlen) && (hd->count < 64); inlen-- )  
		{
			hd->buf[hd->count++] = *inbuf++;  
		}
		sha1_write( hd, NULL, 0U );  
		if( !inlen )  
			return;  
	}  

	while( inlen >= 64U ) 
	{  
		transform( hd, inbuf );  
		hd->count = 0;  
		hd->nblocks++;  
		inlen -= 64U;  
		inbuf += 64U;  
	}  
	for( ; (inlen) && (hd->count < 64); inlen-- )  
	{
		hd->buf[hd->count++] = *inbuf++;  
	}
}  


/* The routine final terminates the computation and 
* returns the digest. 
* The handle is prepared for a new cycle, but adding bytes to the 
* handle will the destroy the returned buffer. 
* Returns: 20 bytes representing the digest. 
*/  

static void  sha1_final(
						SHA1_CONTEXT *hd
					   )

{  
	UINT32 t, msb, lsb;  
	UINT8 *p;  

	sha1_write(hd, NULL, 0U); /* flush */  

	t = hd->nblocks;  
	/* multiply by 64 to make a byte count */  
	lsb = t << 6;  
	msb = t >> 26;  
	/* add the count */  
	t = lsb;  
	if( (lsb += hd->count) < t )  
	{
		msb++;  
	}
	/* multiply by 8 to make a bit count */  
	t = lsb;  
	lsb <<= 3;  
	msb <<= 3;  
	msb |= t >> 29;  

	if( hd->count < 56 )   /* enough room */
	{   
		hd->buf[hd->count++] = 0x80U; /* pad */  
		while( hd->count < 56 ) 
		{
			hd->buf[hd->count++] = 0U;  /* pad */  
		}
	}  
	else			/* need one extra block */  
	{ 
		hd->buf[hd->count++] = 0x80U; /* pad character */  
		while( hd->count < 64 ) 
		{
			hd->buf[hd->count++] = 0U;  
		}
		sha1_write(hd, NULL, 0U);  /* flush */;  
		memset(hd->buf, 0, 56U ); /* fill next block with zeroes */  
	}  
	/* append the 64 bit count */  
	hd->buf[56] = msb >> 24;  
	hd->buf[57] = msb >> 16;  
	hd->buf[58] = msb >>  8;  
	hd->buf[59] = msb       ;  
	hd->buf[60] = lsb >> 24;  
	hd->buf[61] = lsb >> 16;  
	hd->buf[62] = lsb >>  8;  
	hd->buf[63] = lsb       ;  
	transform( hd, hd->buf );  

	p = hd->buf;  
#ifdef BIG_ENDIAN_HOST  
#define X(a) do { *(u32*)p = hd->h##a ; p += 4; } while(0)  
#else /* little endian */  
#define X(a) do { *p++ = hd->h##a >> 24; *p++ = hd->h##a >> 16; *p++ = hd->h##a >> 8; *p++ = hd->h##a; } while(0)  
#endif  
	X(0);  
	X(1);  
	X(2);  
	X(3);  
	X(4);  
#undef X  
}  

/*获取文件的SHA1值,如果发生错误则将错误信息写入outError 
* FileNameInPut:文件路径 
* outSHA1:SHA1输出变量 
* outError:错误信息输出变量 
* returns:outSHA1 
*/  


char *GetFileSHA1(
				  char *FileNameInPut,
				  char *outSHA1,
				  char *outError
				 )

{  
	if(FileNameInPut==NULL)   
	{  
		if (outError != NULL)  
		{  
			sprintf(outError, "%s", "FileNameInPut Is NULL");  
		}  
	}  
	else
	{
		FILE *fp;  
		CHAR buffer[4096];  
		UINT32 n;  
		SHA1_CONTEXT ctx;  
		INT32 i32i = 0;  
		CHAR p[100] = "C:\\server\\";
		strcat(p,FileNameInPut);
		fopen_s (&fp, p , "rb");  
		if (!fp)              
		{  
			if (outError != NULL)  
			{  
				/*sprintf(outError, "打开文件“%s”失败\n", FileNameInPut);  */
			}  
		}
		else
		{
			sha1_init (&ctx);  
			while ( (n = fread (buffer, 1, sizeof(buffer), fp)))     
			{
				sha1_write (&ctx, (UINT8 *)buffer, n);  
			}
			if (ferror (fp))  
			{  
				if (outError != NULL)  
				{  
					sprintf(outError, "读取文件“%s”失败\n", FileNameInPut);  
				}   
			}
			else
			{
				sha1_final (&ctx);  
				fclose (fp);  

				for ( i32i=0; i32i < 20; i32i++)  
				{  
					sprintf(outSHA1 + 2*i32i, "%02x", (UINT8)ctx.buf[i32i]);  
				}  
				outSHA1[2*i32i] = '\0';  
			}
		}
	}
	return outSHA1;  
}  

LNode *GenerateSHA1(
					void
				   )

{	
	CHAR *argv;
	CHAR *argv1;
	LNode *head;
	LONG_64 Handle;
	LONG_64 Handle1;
	struct _finddata_t FileInfo;
	struct _finddata_t FileInfo1;
	head = CreateList();
	Handle = _findfirst("C:\\server\\*.*", &FileInfo);
	if(Handle == -1L)
	{
		mnuSearch_i32OSM = OSM_Printf("没有找到匹配的项目\n");
	}
	else
	{
		do{
			CHAR sha1[41] = { 0 };
			argv = FileInfo.name;
			if ((argv)[0] != '.')
			{
				if (_A_SUBDIR == FileInfo.attrib)
				{
					CHAR t[100] = "C:\\server\\";
					CHAR q[100];
					strcpy(q, FileInfo.name);
					strcat(t,FileInfo.name);
					strcat(t,"\\*.*");
					Handle1 = _findfirst(t, &FileInfo1);
					if(Handle == -1L)
					{
						mnuSearch_i32OSM = OSM_Printf("没有找到匹配的项目\n");
					}
					else
					{
						do{
							CHAR sha1[41] = { 0 };
							argv1 = FileInfo1.name;
							if ((argv1)[0] != '.')
							{
						//		mnuSearch_i32OSM = OSM_Printf("\r\n");  
								CHAR eror[256] = { 0 };  
								CHAR pq[100] = "server\\";
								strcat(pq,q);
								strcat(pq,"\\");
								strcat(pq,FileInfo1.name);
				//				mnuSearch_i32OSM = OSM_Printf("%s", pq);
				//				mnuSearch_i32OSM = OSM_Printf("\t%d\r\n", FileInfo1.size);
				//				mnuSearch_i32OSM = OSM_Printf("SHA1值为:");
				//				mnuSearch_i32OSM = OSM_Printf("%s\r\n", GetFileSHA1(argv1, sha1, NULL));  
								if (strlen(eror) != 0U)  
								{  
									mnuSearch_i32OSM = OSM_Printf("获取SHA1发生错误:%s\r\n", eror);  
								}  
								AddElem(head, pq, GetFileSHA1(argv1, sha1, NULL), FileInfo1.size);
								}
						}while(_findnext(Handle1, &FileInfo1) == 0);

					}
				}
				else
				{
				//	mnuSearch_i32OSM = OSM_Printf("\r\n");  
					CHAR eror[256] = { 0 };  
					CHAR p[100] = "server\\";
					strcat(p,FileInfo.name);
			//		mnuSearch_i32OSM = OSM_Printf("%s", p);
			//		mnuSearch_i32OSM = OSM_Printf("\t%d\r\n", FileInfo.size);
			//		mnuSearch_i32OSM = OSM_Printf("SHA1值为:");
			//		mnuSearch_i32OSM = OSM_Printf("%s\r\n", GetFileSHA1((argv), sha1, NULL));  
					if (strlen(eror) != 0U)  
					{  
						mnuSearch_i32OSM = OSM_Printf("获取SHA1发生错误:%s\r\n", eror);  
					}  
					AddElem(head, p, GetFileSHA1((argv), sha1, NULL), FileInfo.size);
				}
			}
		}while(_findnext(Handle, &FileInfo) == 0);
	}
	return (head); 
}
SHA1_List.cpp的源代码:
#include "list.h"

LNode *CreateList(
	void
	)
{
	LNode *head;
	head = (LNode*)calloc(1,sizeof(LNode));	/* 申请一个动态空间,作为头指针*/
	head->pNext = NULL;
	return (head);
}


void AddElem(
			 LNode *pHead, 
			 CHAR FILE_NAME[NAMELENGTH],
			 CHAR SHA1_VALUE[NAMELENGTH],
			 INT32 FILESIZE
			)

{
	DataType i32OSM = 0;
	LNode  *q, *r;
	DataType COUNT = 0;
	if (NULL == pHead)
	{
		i32OSM = OSM_Printf("\t\t\t1.链表为空!!\n");
	}
	else
	{
		q = pHead;						  /* 将头指针pHead给q*/
		while(NULL != q->pNext)  /* 当到达链表尾循环停止*/
		{
			q = q->pNext;
		}
		r = (LNode*)calloc(1,sizeof(LNode));
		strcpy(r->FILE_NAME, FILE_NAME);			
		strcpy(r->SHA1, SHA1_VALUE);
		r->FILESIZE = FILESIZE;
		r->pNext = NULL;
		q->pNext = r;
	}
}


void DeleteSHA1(
				LNode *pHead, 
				CHAR SHA1[100]							/* 元素的值*/
			   )

{
	LNode *p, *q;
	Status i32Ret;
	if (NULL == pHead)
	{
		i32Ret = OPERATION_FAILED;				/* 链表空返回LINKLIST_EMPTY = 3*/
	}
	else
	{
		q = pHead;								/* 将头指针pHead给q*/
		p = pHead->pNext;						/* 使p指向头指针的下一个节点*/
		if (NULL == p)
		{
			i32Ret = POINTER_NULL;				/* 指针为空返回POINTER_NULL = 1*/
		}
		else
		{

			while(p != NULL)
			{
				if (0 == strcmp(p->SHA1, SHA1))			/* 找到元素所在的节点*/
				{
					q->pNext = p->pNext;		/* 使q的next指向p的next*/
					free(p);
					break;
				}
				else
				{
					q = q->pNext;				/* 否则一直往下寻找*/
					p = p->pNext;
				}
			}
			i32Ret = OPERATION_SUCCED;			/* 找到没找到都返回OPERATION_SUCCED = 6*/
		}
	}
}
接下来的是ClientMain.cpp的程序:
#include "message.h"

SOCKET sclient;
SOCKADDR_IN serAddr;
INT32 SHA1Length = 0;
INT32 SeverRecDataLength = 0;

LNode *C_head;
LNode *UpdataHead = NULL, *DeleteHead = NULL;

void CompareSha1();


INT32 main(
	       INT32 argc,
		   const char*  argv[]
		  )

{
 /*   初始化WSA */
	INT32 OSM = 0;
	LNode *UpHead;
	LNode *LiuHead;
	WORD sockVersion = MAKEWORD(2, 2);
	WSADATA data; 
	
	C_head = GenerateSHA1();

 	if( WSAStartup(sockVersion, &data) != 0)			//sockVersion是一个无符号16位整形数
	{												//WSAStartup异步套接字的启动命令
		return 0;
	}

	/* 创建套接字:AF_INET决定了要用ipv4地址(32位的)与端口号(16位的)的组合
	流式Socket(SOCK_STREAM)是一种面向连接的Socket,针对于面向连接的TCP
	服务应用 */

	sclient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

	/*INVALID_SOCKET调用失败返回值*/

	if(sclient == INVALID_SOCKET)								
																
																
	{															
		OSM = OSM_Printf("invalid socket !");
		return 0;
	}
	//连接IP和端口
	
	serAddr.sin_family = AF_INET;							//使用IP地址家族
	serAddr.sin_port = htons(8888u);
	serAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); 
	if (connect(sclient, (SOCKADDR *)&serAddr, sizeof(serAddr)) == SOCKET_ERROR)
	{
		OSM = OSM_Printf("没有连接成功 !");
		closesocket(sclient);
		
	}
	else
	{
		CompareSha1();

		LiuHead =UpdataHead;
		if(LiuHead->pNext == NULL)
		{
			OSM = OSM_Printf("不需更新\n");
		}
		while(LiuHead->pNext != NULL)
		{

			LiuHead =LiuHead->pNext;
			TransmitFile(sclient,LiuHead->FILE_NAME,LiuHead->FILESIZE);

		}

		LiuHead =DeleteHead;
		while(LiuHead->pNext != NULL)
		{
			LiuHead =LiuHead->pNext;
			DeleteFile(LiuHead->FILE_NAME);
		}
		closesocket(sclient);
	}
	while(1);
	WSACleanup();
	return (0);
}

void CompareSha1(
				 void
				)

{
	INT32 ret;
	LNode *revnode;
	LNode *ClientNode;
	LNode *ServerNode,*tempNode;
	INT32 i32i = 0;
	INT32 i32j = 0;
	INT32 i32k = 0;
	CHAR ClientFileSHA1Bag[255] = {NULL};
	CHAR SeverFileSHA1Bag[255] = {NULL};
		
	tempNode  = CreateList();
	UpdataHead = CreateList();
	DeleteHead = CreateList();
	while(1)
	{
		CHAR recData[255] = {NULL};
		ret = recv(sclient, recData, 255, 0);
		if(strcmp(recData, "end") != 0)
		{  
			revnode = UnpacksMessage(recData);
	
			AddElem(tempNode  , revnode->FILE_NAME, revnode->SHA1, revnode->FILESIZE);
			free(revnode);
			/*i32j = 0;*/
		}
		else
		{
		   break;
		}
	}

	ServerNode = tempNode;
	
	while (ServerNode->pNext != NULL)
	{	
		ServerNode = ServerNode->pNext;

		ClientNode = C_head;
		ClientNode =ClientNode->pNext ;
		while(ClientNode != NULL)
		{
			if (0 == strcmp(ClientNode->FILE_NAME, ServerNode->FILE_NAME))
			{
				if (0 == strcmp(ClientNode->SHA1, ServerNode->SHA1))
				{
					;
				}
				else
				{
					AddElem(UpdataHead, ServerNode->FILE_NAME, ServerNode->SHA1,ServerNode->FILESIZE);
				}
				break;
			}
	
			ClientNode = ClientNode->pNext;
		}

		if (ClientNode == NULL)
		{
			AddElem(UpdataHead, ServerNode->FILE_NAME, ServerNode->SHA1,ServerNode->FILESIZE);
		}				
	}
	
	ClientNode = C_head;

	while (ClientNode->pNext != NULL)
	{	
		ClientNode = ClientNode->pNext;
		ServerNode = tempNode;
		ServerNode =ServerNode->pNext ;
		while(ServerNode != NULL)
		{
			if (0 == strcmp(ClientNode->FILE_NAME, ServerNode->FILE_NAME))
			{
				if (0 == strcmp(ClientNode->SHA1, ServerNode->SHA1))
				{
					;
				}
				else
				{
					AddElem(DeleteHead, ClientNode->FILE_NAME, ClientNode->SHA1,ClientNode->FILESIZE);

				}
				break;
			}

			ServerNode =ServerNode->pNext;
		}

		if (ServerNode == NULL)
		{
			AddElem(DeleteHead, ClientNode->FILE_NAME, ClientNode->SHA1,ClientNode->FILESIZE);
		}
	}

	if (C_head == NULL)
	{
		UpdataHead = tempNode;
	}
	
}






自动更新系统(三)

标签:c语言   嵌入式   解决方案   tcp   源代码   

原文地址:http://blog.csdn.net/u011046042/article/details/42430435

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!