// UpgradeDialog.cpp : implementation file
//#include "stdafx.h"
#include "Upgrade.h"
#include "UpgradeDialog.h"#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif/////////////////////////////////////////////////////////////////////////////
// CUpgradeDialog dialog
CUpgradeDialog::CUpgradeDialog(CWnd* pParent /*=NULL*/)
: CDialog(CUpgradeDialog::IDD, pParent)
{
//{{AFX_DATA_INIT(CUpgradeDialog)
m_strUpgrade = _T("");
//}}AFX_DATA_INIT
// m_FileName = _T("");
// m_FilePath = _T("");
m_strMCUName = _T("");
m_MCUIPAddr = 0;
m_hFile = NULL;
}
void CUpgradeDialog::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CUpgradeDialog)
DDX_Text(pDX, IDC_STATIC_UPGRADE, m_strUpgrade);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CUpgradeDialog, CDialog)
//{{AFX_MSG_MAP(CUpgradeDialog)
ON_WM_SHOWWINDOW()
ON_WM_TIMER()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////
// CUpgradeDialog message handlers
void CUpgradeDialog::OnShowWindow(BOOL bShow, UINT nStatus) 
{
CDialog::OnShowWindow(bShow, nStatus);

// TODO: Add your message handler code here
//
m_strUpgrade = "正在准备升级……";
this->UpdateData(FALSE);

UINT Timer = this->SetTimer(1,1000,NULL);
if (Timer == 0)
{
this->m_strUpgrade = "升级失败,自动退出……";
this->UpdateData(FALSE);
Sleep(1000);

this->EndDialog(1);
}
}void CUpgradeDialog::OnTimer(UINT nIDEvent) 
{
// TODO: Add your message handler code here and/or call default
KillTimer(nIDEvent);

SOCKET sClient; __try
{
SOCKADDR_IN McuIPAddr;

// FILEINFO fInfo;
// UpgradeFile* pUpgradeFile = m_pUpgradeFile;
unsigned long ACK_REV = 0xFFFFFFFF; //建立socket连接
m_strUpgrade = "正在连接";// + m_strMCUName + "(MCU)……";
m_strUpgrade += m_strMCUName;
m_strUpgrade += "(MCU)……";
UpdateData(FALSE);

m_strUpgrade = "连接";// + m_strMCUName + "失败自动退出……";
m_strUpgrade += m_strMCUName;
m_strUpgrade += "失败自动退出……"; if ((sClient = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)) == INVALID_SOCKET)
{
return;
}

McuIPAddr.sin_family = AF_INET;
McuIPAddr.sin_port = htons(MCU_UPGRADE_PORT);
McuIPAddr.sin_addr.S_un.S_addr = m_MCUIPAddr;//inet_addr("172.96.33.85");//m_MCUIPAddr;

if (connect(sClient,(SOCKADDR *)&McuIPAddr,sizeof (McuIPAddr)) == SOCKET_ERROR)
{
// this->MessageBox("test");
return;
}

m_strUpgrade = "握手";// + m_strMCUName + "(MCU)失败自动退出……";
m_strUpgrade += m_strMCUName;
m_strUpgrade += "(MCU)失败自动退出……";
if (recv(sClient, (char*)&ACK_REV, sizeof(ACK_REV), 0) == SOCKET_ERROR)
{
return;
} if (ACK_REV != ACK_CONNECT_OK)
{
return;
}
TRACE0("连接MCU成功\n"); //等待停止MCU服务
this->m_strUpgrade = "正在停止";// + m_strMCUName +"的MCU服务……";
m_strUpgrade += m_strMCUName;
m_strUpgrade += "的MCU服务……";
this->UpdateData(FALSE);
m_strUpgrade = "停止";// + m_strMCUName + "的MCU服务失败自动退出……";
m_strUpgrade += m_strMCUName;
m_strUpgrade += "的MCU服务失败自动退出……";
if (recv(sClient, (char*)&ACK_REV, sizeof(ACK_REV), 0) == SOCKET_ERROR)
{
return;
}

if (ACK_REV != ACK_STOP_MCU)
{
return;
} TRACE0("停止MCU成功\n");
if (send(sClient, (char *)&m_FileInfo, sizeof(m_FileInfo), 0) == SOCKET_ERROR)
{
return;
} m_strUpgrade = "正在发送文件";// + pUpgradeFile->m_FileName + "……";
m_strUpgrade += m_FileInfo.FileName;
m_strUpgrade += "……";
this->UpdateData(FALSE);

m_hFile = CreateFile(m_PathName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_HIDDEN, NULL);
if (m_hFile == INVALID_HANDLE_VALUE)
{
m_strUpgrade = "打开文件";// + pUpgradeFile->m_FileName + "失败自动退出……";
m_strUpgrade += m_FileInfo.FileName;
m_strUpgrade += "失败自动退出……";

return;
}

m_strUpgrade = "发送文件";// + pUpgradeFile->m_FileName + "失败自动退出……";
m_strUpgrade += m_FileInfo.FileName;
m_strUpgrade += "失败自动退出……"; if (recv(sClient, (char*)&ACK_REV, sizeof(ACK_REV), 0) == SOCKET_ERROR)
{
return;
}

if (ACK_REV != ACK_REV_FILEINFO)
{
return;
}

if (!TransmitFile(sClient, m_hFile, 0, 0, NULL, NULL, 0))
{
return;
}
TRACE0("发送文件成功\n");
if (recv(sClient, (char*)&ACK_REV, sizeof(ACK_REV), 0) == SOCKET_ERROR)
{
return;
}

if (ACK_REV != ACK_REV_FILE)
{
return;
}

/* while (pUpgradeFile != NULL)
{
m_strUpgrade = "正在发送文件";// + pUpgradeFile->m_FileName + "……";
m_strUpgrade += pUpgradeFile->m_FileName;
m_strUpgrade += "……";
this->UpdateData(FALSE); strcpy(fInfo.FileName,LPCSTR(pUpgradeFile->m_FileName)); m_hFile = CreateFile(LPCTSTR(pUpgradeFile->m_FilePath), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_HIDDEN, NULL);
if (m_hFile == INVALID_HANDLE_VALUE)
{
m_strUpgrade = "打开文件";// + pUpgradeFile->m_FileName + "失败自动退出……";
m_strUpgrade += pUpgradeFile->m_FileName;
m_strUpgrade += "失败自动退出……"; return;
}
fInfo.FileSize = GetFileSize(m_hFile, NULL); m_strUpgrade = "发送文件";// + pUpgradeFile->m_FileName + "失败自动退出……";
m_strUpgrade += pUpgradeFile->m_FileName;
m_strUpgrade += "失败自动退出……";
if (send(sClient, (char *)&fInfo, sizeof(FILEINFO), 0) == SOCKET_ERROR)
{
return;
}

if (recv(sClient, (char*)&ACK_REV, sizeof(ACK_REV), 0) == SOCKET_ERROR)
{
return;
}

if (ACK_REV != ACK_REV_FILEINFO)
{
return;
} if (!TransmitFile(sClient, m_hFile, 0, 0, NULL, NULL, 0))
{
return;
} if (recv(sClient, (char*)&ACK_REV, sizeof(ACK_REV), 0) == SOCKET_ERROR)
{
return;
}

if (ACK_REV != ACK_REV_FILE)
{
return;
} CloseHandle(m_hFile);
m_hFile = NULL;
pUpgradeFile = pUpgradeFile->m_pNext;
Sleep(2000);
}
*/
//正在升级MCU
this->m_strUpgrade = "文件传送完毕,正在升级MCU服务……";
this->UpdateData(FALSE); this->m_strUpgrade = "升级MCU服务失败";
if (recv(sClient, (char*)&ACK_REV, sizeof(ACK_REV), 0) == SOCKET_ERROR)
{
return;
}

if (ACK_REV != ACK_REV_UPGRADE_OK)
{
return;
}
else
{
this->m_strUpgrade = "MCU服务升级成功";
this->UpdateData(FALSE);
}
Sleep(2000);

//启动MCU服务
this->m_strUpgrade = "正在启动MCU服务……";
this->UpdateData(FALSE); this->m_strUpgrade = m_strMCUName;// + "(MCU)服务启动失败";
this->m_strUpgrade += "(MCU)服务启动失败";;
if (recv(sClient, (char*)&ACK_REV, sizeof(ACK_REV), 0) == SOCKET_ERROR)
{
return;
}

if (ACK_REV == ACK_REV_MCU_ERROR)
{
this->m_strUpgrade = m_strMCUName;// + "(MCU)服务重新启动";
this->m_strUpgrade += "(MCU)服务重新启动失败";
this->UpdateData(FALSE);
return;
}
else if (ACK_REV == ACK_REV_MCU_OK)
{
this->m_strUpgrade = m_strMCUName;// + "(MCU)服务重新启动";
this->m_strUpgrade += "(MCU)服务重新启动";
this->UpdateData(FALSE);
}
}
__finally
{
UpdateData(FALSE);
closesocket(sClient);
CloseHandle(m_hFile);
m_hFile = NULL;

Sleep(20000);
this->EndDialog(0);
}

// CDialog::OnTimer(nIDEvent);
return;
}BOOL CUpgradeDialog::VerifyFile()
{
//
 
return TRUE;
}void CUpgradeDialog::OnOK() 
{
return;
}void CUpgradeDialog::OnCancel() 
{
return;
}把以上代码 翻译为 java 代码 高分送上

解决方案 »

  1.   


    原来ZangXT不是学C/C++出身的。
      

  2.   

    很简单, 就是socket通讯的程序.  
    OnTimer()用线程控制就可以了.
      

  3.   

    呵呵,目前主要还是用C++。程序能看懂,也算用过vc。
    但是java的swing我不怎么懂。
      

  4.   

    java & C++???
    这两个东西???
    ???
      

  5.   

    #include "Upgrade.h"
    #include "UpgradeDialog.h"
    这两个头文件都没有贴出来呀
      

  6.   

    代码大概这样,只翻译了onTimer()
    import java.io.InputStream;
    import java.io.FileInputStream;
    import java.net.Socket;public class CUpgradeDialog { private static final int ACK_CONNECT_OK = 1;
    private static final int ACK_STOP_MCU = 2;
    private static final int ACK_REV_FILEINFO = 3;
    private static final int ACK_REV_FILE = 4;
    private static final int ACK_REV_UPGRADE_OK = 5;
    private static final int ACK_REV_MCU_ERROR = 6;
    private static final int ACK_REV_MCU_OK = 7;

    private String m_strUpgrade;
    private int ACK_REV;
    private FileInfo m_FileInfo;
    private String m_MCUIPAddr;
    private int MCU_UPGRADE_PORT;
    private String m_strMCUName;
    private String m_PathName;

    public void onTimer() {
    Socket sock = null;
    InputStream in = null;

    try {
    m_strUpgrade = "正在连接" + m_strMCUName + "(MCU)...";
    System.out.println( m_strUpgrade );
    m_strUpgrade = "连接" + m_strMCUName + "失败自动退出……";
    System.out.println( m_strUpgrade );
    sock = new Socket( m_MCUIPAddr, MCU_UPGRADE_PORT );
    m_strUpgrade = "握手" + m_strMCUName + ""(MCU)失败自动退出……" ;
    System.out.println( m_strUpgrade );
    int ACK_REV = sock.getInputStream().read();
    if( ACK_REV != ACK_CONNECT_OK ) {
    return;
    }
    System.out.println("连接MCU成功");
    m_strUpgrade = "正在停止" + m_strMCUName + "的MCU服务……";
    System.out.println( m_strUpgrade );
    m_strUpgrade = "停止" + m_strMCUName + "的MCU服务失败自动退出……";
    ACK_REV = sock.getInputStream().read();
    if( ACK_REV != ACK_STOP_MCU ) {
    return;
    }
    System.out.println("停止MCU成功" );
    sock.getOutputStream().write( m_FileInfo.getBytes() );
    m_strUpgrade = "正在发送文件" + m_FileInfo.FileName + "....";

    try {
    in = new FileInputStream( m_PathName );
    }catch( Exception ex ) {
    m_strUpgrade = "打开文件" + m_FileInfo.FileName + "失败自动退出……";
    System.out.println( m_strUpgrade );
    return;
    }

    m_strUpgrade = "发送文件" + m_FileInfo.FileName + "失败自动退出……" );
    ACK_REV = sock.getInputStream().read();
    if( ACK_REV != ACK_REV_FILEINFO ) {
    return;
    }

    if( !TransmitFile( sock, in ) ) {
    return;
    }
    System.out.println( "发送文件成功" );
    ACK_REV = sock.getInputStream().read();
    if( ACK_REV != ACK_REV_FILE ) {
    return;
    }
    m_strUpgrade = "文件传送完毕,正在升级MCU服务……";
    System.out.println( m_strUpgrade );
    m_strUpgrade = "升级MCU服务失败";
    ACK_REV = sock.getInputStream().read();
    if( ACK_REV != ACK_REV_UPGRADE_OK) {
    return;
    }
    m_strUpgrade = "MCU服务升级成功";

    System.out.println( m_strUpgrade );
    m_strUpgrade = "正在启动MCU服务……";
    System.out.println( m_strUpgrade );
    m_strUpgrade = m_strMCUName + "(MCU)服务启动失败";
    ACK_REV = sock.getInputStream().read();
    if( ACK_REV == ACK_REV_MCU_ERROR ) {
    m_strUpgrade = m_strMCUName + (MCU)服务重新启动失败";
    System.out.println( m_strUpgrade );
    } else if(ACK_REV == ACK_REV_MCU_OK) {
    m_strUpgrade = m_strMCUName + "(MCU)服务重新启动";
    System.out.println( m_strUpgrade );
    }
    }catch( Exception ex ) {
    }finally {
    try {
    sock.close();
    }catch( Exception ex ) {
    }
    try {
    in.close();
    }catch( Exception ex ) {
    }
    }
    }
    }
      

  7.   

    1 打开一个窗口
    2 启动工作定时器
    3 做socket连接 和服务器端进行数据交互
    4 最后关闭socket 关闭窗口配套的应该还有一个主工作程序,用来启动这个窗口