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

📄 file2eth.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 "file2eth.h"
#ifdef DEBUG
	#define dbg_log MyTrace
#else
   #define dbg_log   __noop
#endif
#define usleep(uCount) \
	Sleep(uCount /1000 )


 struct FILESTRU{
	DWORD dwHash;
	HANDLE hFile;
};
CSimpleArray<FILESTRU>g_FileStru;
 struct FILEPATH{
	DWORD dwID;
	TCHAR szSaveFolder[MAX_PATH];
};
SOCKET sd_client=0;
extern HANDLE g_hQuitServiceEvent;

CSimpleArray<FILEPATH>g_SaveFolder;
extern TCHAR g_szCurDir[MAX_PATH]; 

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[ 1024 ];

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

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

BOOL sendfile( CSHProgressWnd* pDlg,char* lpszFileName,int nID){	HANDLE hFile=CreateFile(lpszFileName,		GENERIC_READ,		0,		NULL,		OPEN_EXISTING,		FILE_ATTRIBUTE_NORMAL,		NULL);	if(hFile==INVALID_HANDLE_VALUE){		dbg_log("File %s not existed\n",lpszFileName);		return FALSE;	}	DWORD dwFileSize=GetFileSize(hFile,NULL);	HANDLE hMap=CreateFileMapping(hFile,NULL,PAGE_READONLY,0,dwFileSize,NULL);	if(hMap==NULL){		dbg_log("CreateFileMapping %s Error\n",lpszFileName);		CloseHandle(hFile);		return FALSE;	}	PVOID pvFile=MapViewOfFile(hMap,FILE_MAP_READ,0,0,0);	if(pvFile==NULL){		dbg_log("MapViewOfFile %s Error\n",lpszFileName);		CloseHandle(hMap);		CloseHandle(hFile);		return FALSE;	}
	pDlg->SetLineText(1,lpszFileName);

	pDlg->UpdateProgress ( 0, dwFileSize );
	PacketInfo pi;	ZeroMemory((void*)&pi,DATA_LEN);
	pi.dwFlag=FILE_HEADER_FLAG;
	pi.dwLen=sizeof(FILE_HEADER);
	pi.fh.dwFileLen=dwFileSize;

	/*TCHAR *szFileName=_tcsrchr(lpszFileName,'\\');
	szFileName++;*/

	
	_tcscpy(pi.fh.szFileName,lpszFileName+_tcslen(g_szCurDir)+1);
	DWORD dwCheckSum=checksum((BYTE*)pi.fh.szFileName,_tcslen(pi.fh.szFileName));
	pi.fh.dwFileHash=dwCheckSum;
	int i=0;
	//char buff[DATA_LEN];
    	BOOL bInputEnd=FALSE;
	DWORD dwWaitResult; 
	pi.ID=nID;
	int writelen=SendData((char*)&pi,DATA_LEN);
	pi.dwFlag=FILE_BODY_FLAG;
	pi.dwLen=sizeof(FILE_BODY);
	pi.fb.dwFileHash=dwCheckSum;

	pi.fb.dwFilePos=0;
	PBYTE pbBuffer=(PBYTE)pvFile;	DWORD dwCount=dwFileSize;	int nWriteCount;	TCHAR szMsg[1024];	while(dwCount!=0 && !bInputEnd){		if (pDlg->HasUserCanceled()) {
			bInputEnd=TRUE;

			pDlg->EndDialog();
			goto exit;
		} 		pi.fb.dwBlockSize=dwCount<DATA_LEN-24?dwCount:DATA_LEN-24;		memcpy(pi.fb.byData,pbBuffer,pi.fb.dwBlockSize);		writelen=SendData((char*)&pi,DATA_LEN);		dwCount-=pi.fb.dwBlockSize;		pbBuffer+=pi.fb.dwBlockSize;
		pi.fb.dwFilePos=dwFileSize-dwCount;
		wsprintf ( szMsg, _T("已经发送%d字节\n"), dwFileSize-dwCount );
		//OutputDebugString(szMsg);
		pDlg->SetLineText ( 2, szMsg );
		pDlg->UpdateProgress ( dwFileSize-dwCount );
	}//while
	//发送文件结束标记

exit:

	pi.dwFlag=FILE_TAILER_FLAG;
	pi.dwLen=sizeof(FILE_TAILER);
	pi.ft.dwFileHash=dwCheckSum;
	pi.ft.dwEndFlag=01;
	pi.ft.dwFileLen=dwFileSize;
	pi.ID=nID;
	writelen=SendData((char*)&pi,DATA_LEN);	UnmapViewOfFile(pvFile);	CloseHandle(hMap);	CloseHandle(hFile);	return TRUE;}int SendData(char* buff,int len){	    int  nSendPos=0;		int nSend=0;		while (nSendPos < DATA_LEN )
		{
			nSend = send(sd_client, (char*)buff + nSendPos, DATA_LEN - nSendPos, 0);
			if (nSend == 0){
               	return nSendPos;
			}
			if (nSend <0){ 
				
				EndSend();
	            
				return -1;
			}
			nSendPos += nSend;

		}	return len;}



void ShowHtmlDlg(CString szResURL,VARIANT* VarIn,VARIANT* VarOut,WCHAR* bstrOption)
{
  
	CoInitialize(NULL);
	TCHAR szURL[_MAX_PATH + 128];
	// now use the "res://" protocol to identify a dialog
	TCHAR szPath[_MAX_PATH]; // _MAX_PATH eqs 260
	GetModuleFileName(_AtlBaseModule.GetResourceInstance(),szPath,sizeof(szPath));
//	wsprintf(szURL,"http://cn.eusion.com/servlet/getimage");
   	wsprintf(szURL, _T("res://%s/%s"), szPath, szResURL);// format the URL string
	
	// retrieve the handle of the mshtml.dll
	 HINSTANCE hinstMSHTML = LoadLibrary(TEXT("MSHTML.DLL"));
	if(hinstMSHTML==NULL)return;   
    if (hinstMSHTML)
    {
        SHOWHTMLDIALOGFN* pfnShowHTMLDialog;
        pfnShowHTMLDialog = (SHOWHTMLDIALOGFN*)GetProcAddress(hinstMSHTML,
                                                              TEXT("ShowHTMLDialog"));
		if(pfnShowHTMLDialog==NULL)return;
        if (pfnShowHTMLDialog)
        {
            
			int nLen = strlen(szURL);
		
			IMoniker *pIMoniker=NULL;
			USES_CONVERSION;
			HRESULT hr=CreateURLMoniker(NULL,T2OLE(szURL),&pIMoniker);
			// NOW, TRY TO DISPLAY THE DIALOG
			if(SUCCEEDED(hr)&&pIMoniker!=NULL){
			
			HRESULT h = pfnShowHTMLDialog((HWND)NULL,// NO window handle to pass
				(IMoniker*)pIMoniker, // the moniker interface's pointer
				VarIn, // argument to window.dialogArguments in HTML
				(WCHAR*)bstrOption, // optional auguments, see window.showModalDialog for detail
				VarOut // receive window.returnValue of HTML
				);
			
			}
	          
        }

        FreeLibrary(hinstMSHTML);
    }
	// 128 is an idealy value, must be changed when programming autually
CoUninitialize();

 
}

//获得路径对应的Shell Folder Name
int InitSend()
{

	
	char	*progname =  NULL;
	int	            c =  0; 
	int            no =  0;
    CString        str;
	DWORD dwThread;
	CComVariant v,varIn;
	

	USES_CONVERSION;
	TCHAR g_szIP[30],g_szPort[10];
	GetPrivateProfileString("Config","IP","192.168.8.120",g_szIP,sizeof(g_szIP),"Config.ini");

	GetPrivateProfileString("Config","Port","5050",g_szPort,sizeof(g_szPort),"Config.ini");
	_tcscat(g_szIP,";");
	_tcscat(g_szIP,g_szPort);	
	CComBSTR bstrVal=T2OLE(g_szIP);
	varIn.vt = VT_BSTR;
	varIn.bstrVal = bstrVal;

	ShowHtmlDlg("SelectIPPort.htm",&varIn,&v,L"dialogHeight: 500px; dialogWidth: 600px; center: Yes; help: No; resizable: No; status: No;");
	


	_tcscpy(g_szIP,OLE2CT(v.bstrVal));
	TCHAR *szPos=_tcsrchr(g_szIP,':');
    

	*szPos=0;
	szPos++;
	
	int g_nPort     = atoi(szPos);
	WritePrivateProfileString("Config","IP",g_szIP,"Config.ini");
	WritePrivateProfileString("Config","Port",szPos,"Config.ini");
	if (!sd_client)
	{
		dbg_log("My name is sd_client...\n");
		int                        err;
//		u_short                    iPort;
		char    *pszHost         = NULL;
		char    LocalName[16]    = "";
		struct  sockaddr_in        addr_srv;
		struct  hostent *ptrHost = NULL;
		struct  hostent *pHost   = NULL;

		WSADATA wsaData;

		err = WSAStartup( MAKEWORD(2, 2), &wsaData );
		
		if ( err != 0 ) {
            dbg_log("ERR:WSAStartup()!\n");
			return 0;
		}
		sd_client = socket(AF_INET, SOCK_STREAM, 0);
		if (sd_client == INVALID_SOCKET){
			dbg_log("ERR:sd_client == INVALID_SOCKET!\n");
			return 0;
		}


		addr_srv.sin_family           = AF_INET;
		addr_srv.sin_addr.S_un.S_addr = inet_addr( g_szIP );
		addr_srv.sin_port             = htons(g_nPort);

		int count = 0;	
        err = connect(sd_client, (struct sockaddr *) &addr_srv,sizeof(addr_srv));
        if( err == INVALID_SOCKET ){
			dbg_log("连接服务器失败!IP:%s Port:%d\n",g_szIP,g_nPort);
			
			closesocket(sd_client);
			sd_client=NULL;
			return 0;
		}
		dbg_log("Connect()!\n");
		return 1;
	}
	/*if (!bFile) {

		int i=0;
		BOOL bInputEnd=FALSE;
		PacketInfo pi;
		ZeroMemory(&pi,DATA_LEN);
		pi.dwFlag=MESSAGE_FLAG;
		DWORD dwLen=_tcslen(input_fifo);
		dwLen=dwLen>DATA_LEN-8?DATA_LEN-8:dwLen;
		_tcsncpy(pi.szMessage,input_fifo,dwLen);
		pi.dwLen=dwLen;
		
		send (sd_client, (char*)&pi, DATA_LEN, 0);
		beep(400);
	
		return 1;
	}*/
		dbg_log("InitSend().return\n");

	
	return 1;
}
void EndSend()
{
	if( sd_client!=NULL ){
		closesocket(sd_client);
		sd_client=NULL;
		dbg_log("closesocket(sd_client)\n");
	}
	WSACleanup();


}

⌨️ 快捷键说明

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