📄 file2eth.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 + -