⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 eth2file.cpp

📁 这是一本学习 window编程的很好的参考教材
💻 CPP
字号:
/*
gcc -Wall -g `libnet-config --defines` eth2ram.c -o eth2ram `libnet-config --libs` -pthread -lpcap
gcc -DDEBUG -Wall -g `libnet-config --defines` eth2ram.c -o eth2ram `libnet-config --libs` -pthread -lpcap
*/

/*-------------------------------------------------------------
04-04-21  每次发送超时时,都发送一个ack.防止ack丢失
	  参数里添加了发送接口和接收接口

--------------------------------------------------------------*/

#include "stdafx.h"


#include "eth2file.h"
#ifdef DEBUG
	#define dbg_log MyTrace
#else
   #define dbg_log   __noop
#endif


 struct FILESTRU{
	DWORD dwHash;
	HANDLE hFile;
};
CSimpleArray<FILESTRU>g_FileStru;

BOOL g_bSocketError=FALSE;


 struct FILEPATH{
	DWORD dwID;
	TCHAR szSaveFolder[MAX_PATH];
};


CSimpleArray<FILEPATH>g_SaveFolder;

BOOL IsWindowsNT()
{
	BOOL bRet = FALSE;
	BOOL bOsVersionInfoEx;
	OSVERSIONINFOEX osvi;

	// Try calling GetVersionEx using the OSVERSIONINFOEX structure,
	// If that fails, try using the OSVERSIONINFO structure.
	ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
	osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);

	if( !(bOsVersionInfoEx = GetVersionEx ((OSVERSIONINFO *) &osvi)) )
	{
		// If OSVERSIONINFOEX doesn't work, try OSVERSIONINFO.
		osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);
		if (! GetVersionEx ( (OSVERSIONINFO *) &osvi) ) 
			return bRet;
	}

	if (osvi.dwPlatformId & VER_PLATFORM_WIN32_NT )
	{
		bRet = TRUE;
	}

	return bRet;
}

BOOL IsWindows2k()
{
	BOOL bRet = FALSE;
	BOOL bOsVersionInfoEx;
	OSVERSIONINFOEX osvi;

	// Try calling GetVersionEx using the OSVERSIONINFOEX structure,
	// If that fails, try using the OSVERSIONINFO structure.
	ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
	osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);

	if( !(bOsVersionInfoEx = GetVersionEx ((OSVERSIONINFO *) &osvi)) )
	{
		// If OSVERSIONINFOEX doesn't work, try OSVERSIONINFO.
		osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);
		if (! GetVersionEx ( (OSVERSIONINFO *) &osvi) ) 
			return bRet;
	}

	if (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT && osvi.dwMajorVersion >= 5)
	{
		bRet = TRUE;
	}

	return bRet;
}
void __declspec(naked)  beepInAsm(void) 
{
	__asm  
	{ 
		pushad
			mov bx, 3000h
			mov cx, ax
			mov al, 0b6h
			out 43h, al
			mov dx, 0012h
			mov ax, 34dch
			div cx
			out 42h, al
			mov al, ah
			out 42h, al
			in al, 61h
			mov ah, al
			or al, 03h
			out 61h, al
l1:
		mov ecx, 4680
l2:
		loop l2
			dec bx
			jnz l1
			mov al, ah
			out 61h, al
			popad

			iretd
	}


}


DWORDLONG IDT,SaveGate;
#define ExceptionUsed 9
WORD OurGate[4]={0,0x28,0x0ee00,0};
BOOL beep(DWORD dwFreq)
{
	if(IsWindowsNT()){
		Beep(dwFreq,500);
		return TRUE;
	}


	__asm{
		mov eax,offset beepInAsm
			mov [OurGate],ax
			shr eax,16
			mov [OurGate+6],ax
			sidt	fword ptr IDT			; fetch IDT register
			mov 	ebx, dword ptr [IDT+2]		; ebx -> IDT
			add	ebx, 8*ExceptionUsed		; Ebx -> IDT entry of ExceptionUsed
			mov edi,offset SaveGate
			mov esi,ebx
			movsd
			movsd
			mov edi,ebx
			mov esi,offset OurGate
			movsd
			movsd


			mov eax ,dwFreq
			int 	ExceptionUsed			; cause exception
			mov edi,ebx
			mov esi,offset SaveGate
			movsd
			movsd
	}



	return TRUE;
}
//CheckSum:计算校验和的子函数 
DWORD checksum(BYTE *buffer, int size) 
{ 
	unsigned long cksum=0; 
	while(size >1) 
	{ 
		cksum+=*buffer++; 
		size -=sizeof(BYTE); 
	} 
	if(size ) 
	{ 
		cksum += *(UCHAR*)buffer; 
	} 

	cksum = (cksum >> 16) + (cksum & 0xffff); 
	cksum += (cksum >>16); 
	return (DWORD)(~cksum); 
} 






void MyTrace( char *fmt, ... )
{
	va_list	arg;
	char	line[ 2048 ];

	va_start( arg, fmt );
	_vsnprintf( line, sizeof( line ), fmt, arg );
	va_end( arg );

	OutputDebugString( line );
	/*syslog( LOG_NOTICE, line );*/
}

void Resume()
{
	if (output_id!=0) {
		ResumeThread(output_id);
	}

}

void Suspend()
{
	if (output_id!=0) {
		SuspendThread(output_id);
	}


}

void End()
{
	TerminateThread(output_id,0);	
}


void ServeAClient(LPVOID lpv)
{
    
	dbg_log("ServeAClient()...\n");
	SOCKET sd_accept		= (SOCKET)lpv;
    
    const char *msg         = "HELLO CLIENT";
    char  szData[DATA_LEN]  = "";
	TCHAR szFile[MAX_PATH]  = "";
	char  szMessage[1024]   = "";
	DWORD dwFileSize        = 0,dwFileCount = 0,dwCount = 0;
	BOOL  bExit             = FALSE;
	int   szRecv            = 0,nRevLen     = 0;
	CString str,str1,strtime;
	HANDLE         outputfd = NULL;
	DWORD        dwCheckSum = 0;
	pPacketInfo ppi;

	int idsean=0;
	while (!bExit)
	{
		memset(szData, 0, sizeof(szData));
		while ( szRecv < DATA_LEN ){
			nRevLen=recv(sd_accept,szData + szRecv, DATA_LEN - szRecv,0);
			if ( nRevLen < 0)
			{   
				
				goto exit;
			}
			else if( nRevLen == 0 ){
				if( szRecv <= DATA_LEN ){
					goto exit;
				}
			}
			szRecv += nRevLen;
			dbg_log("已接收数据%d\n",szRecv);
		}
		if (nRevLen>0 && nRevLen<=DATA_LEN)
		{

				
				char	err = 0;


				
				
				DWORD dwCount;
				DWORD dwFileCount=0;
				TCHAR szFile[260];       // buffer for file name
				DWORD dwCheckSum;


				BOOL bBreak=FALSE;
				DWORD dwFileSize=0;
			  


				BOOL bExit=FALSE;

				BOOL bReceive=TRUE;
				FILEPATH fp;
				CString szSaveFolder;
				TCHAR lpszSystemInfo[MAX_PATH];
				DWORD cchBuff=MAX_PATH;






				ppi=(pPacketInfo)szData;
				
				switch(ppi->dwFlag) {
						case FILE_INIT_FLAG:

							if( GetComputerName(lpszSystemInfo, &cchBuff) ) {

								if(_tcsicmp(lpszSystemInfo,ppi->fi.szComputerName)==0)
								{
									bReceive=FALSE;
									continue;
								}
								else
									bReceive=TRUE;
							}
							else
								bReceive=TRUE;

							if(strstr(ppi->fi.szDstFilePath,":\\")){
								_tcscpy(fp.szSaveFolder,ppi->fi.szDstFilePath);
							}
							else if(strstr(ppi->fi.szDstFilePath,"Windows"))
							{
								GetWindowsDirectory(fp.szSaveFolder,MAX_PATH);
								_tcscat(fp.szSaveFolder,"\\");
							}
							else if(strstr(ppi->fi.szDstFilePath,"System"))
							{
								GetSystemDirectory(fp.szSaveFolder,MAX_PATH);
								_tcscat(fp.szSaveFolder,"\\");
							}
							else if(strstr(ppi->fi.szDstFilePath,"Current"))
							{
								GetCurrentDirectory(MAX_PATH,fp.szSaveFolder);
								_tcscat(fp.szSaveFolder,"\\");
							}
							else if(strstr(ppi->fi.szDstFilePath,"Temp"))
							{
								GetTempPath(MAX_PATH,fp.szSaveFolder);
								_tcscat(fp.szSaveFolder,"\\");
							}
							else{

								GetPrivateProfileString("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders",
									ppi->fi.szDstFilePath,
									"c:\\",
									fp.szSaveFolder,
									MAX_PATH,
									"ShellFolder.ini");

							}

							szSaveFolder=fp.szSaveFolder;


							_tcscpy(fp.szSaveFolder,szSaveFolder.GetBuffer(0));


							if(fp.szSaveFolder[_tcslen(fp.szSaveFolder)-1]!='\\'){
								_tcscat(fp.szSaveFolder,"\\");

							}
							//_tcscpy(fp.szSaveFolder,szFolderName);
							fp.dwID=ppi->ID;
							g_SaveFolder.Add(fp);

							break;
						case FILE_HEADER_FLAG:
							if(bReceive){

								for(int i=0;i<g_SaveFolder.GetSize();i++)
								{
									if(g_SaveFolder[i].dwID==ppi->ID){
										dwCheckSum=checksum((BYTE*)ppi->fh.szFileName,_tcslen(ppi->fh.szFileName));

										_tcscpy(szFile,g_SaveFolder[i].szSaveFolder);
										if (szFile[_tcslen(szFile)-1]!='\\') {
											_tcscat(szFile,"\\");
										}
										dwFileSize=ppi->fh.dwFileLen;
										_tcscat(szFile,(TCHAR*)ppi->fh.szFileName);

										outputfd=CreateFile(szFile,	GENERIC_WRITE,
											FILE_SHARE_WRITE,
											NULL,
											CREATE_ALWAYS,
											FILE_ATTRIBUTE_NORMAL,
											NULL);
										if(outputfd!= INVALID_HANDLE_VALUE){
											FILESTRU fs;
											fs.dwHash=dwCheckSum;
											fs.hFile=outputfd;
											g_FileStru.Add(fs);
										}
										dwFileCount=0;

										dwCount=GetTickCount();


										break;
									}
								}
							}
							break;
						case FILE_BODY_FLAG:
							if(bReceive){
								FILE_BODY* pfb=&ppi->fb;
								for(int i=0;i<g_FileStru.GetSize();i++)
								{
									if(g_FileStru[i].dwHash==pfb->dwFileHash ){
										DWORD dwWritten;

										WriteFile(g_FileStru[i].hFile,pfb->byData,pfb->dwBlockSize,&dwWritten,NULL);
										//FlushFileBuffers(g_FileStru[i].hFile);
										dwFileCount=dwFileCount+dwWritten;
										break;
									}
								}
							}

							break;
						case FILE_TAILER_FLAG:
							if (bReceive ) {
								for(int i=0;i<g_FileStru.GetSize();i++)
								{
									if(g_FileStru[i].dwHash==ppi->ft.dwFileHash ){

										CloseHandle(g_FileStru[i].hFile);
										g_FileStru.RemoveAt(i);
										//dwCount=GetTickCount()-dwCount;
										break;
									}
								}

								//beep(400);

							}

							break;

						case MESSAGE_FLAG:
							if(bReceive){
								if(OpenClipboard(GetActiveWindow())) {
	        
								// Empty what's in there...
								EmptyClipboard();
						        
								// Allocate global memory for transfer...
								HGLOBAL hText = GlobalAlloc(GMEM_MOVEABLE |GMEM_DDESHARE, strlen(ppi->szMessage));
						        
								// Put your string in the global memory...
								char *ptr = (char *)GlobalLock(hText);
								strcpy(ptr, ppi->szMessage);
								GlobalUnlock(hText);
								::SetClipboardData(CF_TEXT, hText);
						        
								CloseClipboard();
								// Free memory...
								GlobalFree(hText);
						        
							}
								//beep(400);
							}
							break;
						case FILE_FOLDER_FLAG:
							if(bReceive){
								for(int j=0;j<g_SaveFolder.GetSize();j++)
								{
									if(g_SaveFolder[j].dwID==ppi->ID){
										_tcscpy(szFile,g_SaveFolder[j].szSaveFolder);
										if (szFile[_tcslen(szFile)-1]!='\\') {
											_tcscat(szFile,"\\");
										}
										_tcscat(szFile,ppi->ff.szFilePath);
										USES_CONVERSION;
										SHCreateDirectory(NULL,T2CW(szFile));	
										break;
									}
								}

							}	
							break;
						case FILE_END_FLAG:
							if(bReceive){		

								for(int j=0;j<g_SaveFolder.GetSize();j++)
								{
									if(g_SaveFolder[j].dwID==ppi->ID){

										TCHAR szCommandLine[1024];
										wsprintf(szCommandLine,"explorer.exe /select, %s",g_SaveFolder[j].szSaveFolder);
										WinExec(szCommandLine,SW_SHOWNORMAL);
										beep(400);
										g_SaveFolder.RemoveAt(j);

										bExit=TRUE;				
										break;
									}
								}
							}
							break;
						case CLIPBOARD_FLAG:
							if(bReceive){
								static DWORD dwClipBoardCount=0;
								static PBYTE pClipBoardBuffer=NULL;
								static HGLOBAL hClipBoard =NULL;
								if (!ppi->ci.bEnd)
								{
									if (pClipBoardBuffer==NULL)
									{
										hClipBoard = GlobalAlloc(GMEM_MOVEABLE |GMEM_DDESHARE, ppi->ci.dwDataSize
											);
										pClipBoardBuffer = (BYTE *)GlobalLock(hClipBoard);

									}	
									memcpy(pClipBoardBuffer,ppi->ci.byData,ppi->ci.dwBlockSize);
									pClipBoardBuffer+=ppi->ci.dwBlockSize;
									dwClipBoardCount+=ppi->ci.dwBlockSize;

								}
								else{
										if(OpenClipboard(GetActiveWindow())) {

										// Empty what's in there...
										EmptyClipboard();
										dbg_log("ppi->ci.dwDataSize:%d Recv dwClipBoardCount:%d\n",ppi->ci.dwDataSize,dwClipBoardCount);
										// Allocate global memory for transfer...
										

										// Put your string in the global memory...
										
										
										GlobalUnlock(hClipBoard);
										::SetClipboardData(ppi->ci.uFormat, hClipBoard);

										CloseClipboard();
										// Free memory...
										GlobalFree(hClipBoard);
										dwClipBoardCount=0;
										pClipBoardBuffer=NULL;
										hClipBoard =NULL;
								}
								}
							}
								break;
						default:

							break;
								}


	
				szRecv=0;
		}
	}
exit:
	;	
	
	
}
#define   MAX_SERVED         30

int ServerLoop(SOCKET sd_listen, int isMultiTasking,LPVOID lParam)
{
	dbg_log("ServerLoop()...\n");

	CString str;
	
	SOCKET sd_accept;
	HANDLE handles[MAX_SERVED];
    struct sockaddr_in addr_client;
	
	int    nSize                 = 0 ;
    int    numServed             = 0 ;	
	int    myID                  = 0 ;
	
	g_bSocketError=FALSE;
	
	while (TRUE) {
      nSize = sizeof(addr_client);
	  dbg_log("accept()....\n");
      sd_accept = accept(sd_listen, (struct sockaddr *)&addr_client, &nSize);
	  if (sd_accept == INVALID_SOCKET ){
		 g_bSocketError=TRUE;
		 dbg_log("sd_accept == INVALID_SOCKET\n");
         return 1;
	  }
      if (isMultiTasking) {
		  handles[numServed] = CreateThread(NULL, 1000,(LPTHREAD_START_ROUTINE)ServeAClient,(LPVOID)sd_accept, 0,(LPDWORD)&myID);
      }else
          ServeAClient((LPVOID) sd_accept);
    }
	if (isMultiTasking)     WaitForMultipleObjects(MAX_SERVED, handles,TRUE, INFINITE);
    return 0;
}





void output_thread(LPVOID lParam)
{
	BOOL   bBreak         = FALSE;
	DWORD  dwFileSize     = 0;
  
    int    err;
	SOCKET sd_listen;
    WSADATA wsaData;
    struct sockaddr_in addr_srv;
 
    err = WSAStartup( MAKEWORD(2, 2), &wsaData );
    if ( err != 0 ) return ;

	memset(&addr_srv,0,sizeof( addr_srv));
	sd_listen                = socket(AF_INET, SOCK_STREAM, 0);
    addr_srv.sin_family      = AF_INET;
    addr_srv.sin_addr.s_addr = htonl(INADDR_ANY);

   
    int on = -1;
	int nPort=GetPrivateProfileInt("Config","Port",5050,"Config.ini");
    addr_srv.sin_port = htons(nPort);
	if (-1 == setsockopt(sd_listen, SOL_SOCKET, SO_REUSEADDR, (const char *)&on, sizeof(on)))
    {
        closesocket(sd_listen);
        return ;
    } 
    err = bind(sd_listen, (const struct sockaddr *) &addr_srv,sizeof(addr_srv));
    if (err == INVALID_SOCKET) {
		dbg_log("unable to bind socket,I return\n");
		goto close;
	}
    err = listen(sd_listen, SOMAXCONN);
    if (err == INVALID_SOCKET){
		dbg_log("listen failed,I return.\n");
		goto close;
	}
	/*		Listen Client		*/
	ServerLoop(sd_listen, 1, lParam );
	/*							*/
close:
    dbg_log("output_thread(),return\n");
	if( sd_listen!=NULL ){
		closesocket(sd_listen);
		sd_listen=NULL;
	}
    WSACleanup();

}

int InitRecv()
{

	if ( output_id!=0 ) TerminateThread(output_id,0);
	dbg_log("InitRecv()...\n");
	DWORD dwThread;
	output_id=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)output_thread,NULL,0,&dwThread);  

	return 0;
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -