📄 tcpconnectpage.cpp
字号:
Aggiorna il valore utilizzato come port per la connessione e la configurazione.
*/
void CConnectPage::OnKillFocusComboPort(void)
{
// ricava il testo del combo aggiornando di conseguenza la porta e la configurazione
char szComboEntry[HOSTNAME_SIZE+1];
m_wndComboPort.GetWindowText(szComboEntry,sizeof(szComboEntry));
if(strcmp(szComboEntry,"")==0 || atoi(szComboEntry) < 0)
{
m_wndComboPort.SetWindowText("0");
m_nConnectHostPort = 0;
UpdateData(FALSE);
return;
}
char szPort[16];
_snprintf(szPort,sizeof(szPort)-1,"%u",m_nConnectHostPort);
// controlla se e' stato cambiato il testo del combo
if(strcmp(szComboEntry,szPort)!=0)
{
// aggiorna il nome dell'host di default
m_nConnectHostPort = (UINT)atol(szComboEntry);
// aggiorna la porta di default nella configurazione
m_pConfig->UpdateNumber(TCPSCAN_CONNECT_KEY,TCPSCAN_PORT_KEY,m_nConnectHostPort);
// cerca il testo del combo nella configurazione, se non lo trova deve inserirlo nel
// nel combo e nella configurazione
UINT nPortNumber;
char szKey[REGKEY_MAX_KEY_NAME+1];
BOOL bFound = FALSE;
for(int i = 0; i < m_nMaxPortNumber; i++)
{
_snprintf(szKey,sizeof(szKey)-1,"%s%d",TCPSCAN_PORTNUMBER_KEY,i);
if((nPortNumber = m_pConfig->GetNumber(TCPSCAN_CONNECT_KEY,szKey))!=(UINT)-1)
{
_snprintf(szPort,sizeof(szPort)-1,"%u",nPortNumber);
if(strcmp(szComboEntry,szPort)==0)
{
bFound = TRUE;
break;
}
}
else
break;
}
// non trovato, lo inserisce nel combo se gia' non esiste
if(!bFound)
{
if(i==m_nMaxPortNumber)
m_wndComboPort.DeleteString(0);
if(m_wndComboPort.FindStringExact(-1,szComboEntry)==CB_ERR)
m_wndComboPort.AddString(szComboEntry);
}
// aggiorna le entrate della configurazione con quanto presente nel combo (elimina e reinserisce)
for(i = 0; i < m_nMaxPortNumber; i++)
{
_snprintf(szKey,sizeof(szKey)-1,"%s%d",TCPSCAN_PORTNUMBER_KEY,i);
if(m_pConfig->GetNumber(TCPSCAN_CONNECT_KEY,szKey)!=(UINT)-1)
m_pConfig->Delete(TCPSCAN_CONNECT_KEY,szKey);
}
m_pConfig->Save();
for(i = 0; i < m_nMaxPortNumber; i++)
{
if(m_wndComboPort.GetLBText(i,szComboEntry)!=CB_ERR)
{
_snprintf(szKey,sizeof(szKey)-1,"%s%d",TCPSCAN_PORTNUMBER_KEY,i);
nPortNumber = atol(szComboEntry);
m_pConfig->Insert(TCPSCAN_CONNECT_KEY,szKey,nPortNumber);
}
}
m_pConfig->Save();
}
}
/*
OnConnect()
Effettua il collegamento all'host/porta specificati.
Chiamata dallo sheet per il click sul bottone (IDOK).
*/
LONG CConnectPage::OnConnect(UINT wParam,LONG lParam)
{
static int nConnectIndex = -1;
static TCPSCAN tcpscan;
char* p;
char* pIpAddress = {LOCAL_HOST};
CString strBuffer;
// e' stato cliccato il bottone Cancel, annulla la connessione
if(CHECK_PARAM_MESSAGE(WM_CANCEL))
{
if(m_pAsyncSocket)
m_pAsyncSocket->Close();
wParam = 1;
lParam = 0;
}
// e' stato cliccato il bottone Exit, annulla la connessione
else if(CHECK_PARAM_MESSAGE(WM_CLOSE))
{
if(m_pAsyncSocket)
m_pAsyncSocket->Close();
wParam = lParam = 0;
return(0);
}
// controlla che il costruttore sia riuscito nella inizializzazione
if(!m_pAsyncSocket)
{
AfxMessageBox("Unable to create the internal socket.",MB_ICONWARNING);
return(0);
}
// per gestire i due tipi di connessione (aperta, come con FTP, o chiusa, come con HTTP)
// ricava il testo del bottone IDOK per sapere se si tratta della prima chiamata o delle successive
char szText[32];
GetPropertySheetOkButton(szText);
if(strcmp(szText,"&Send")==0)
{
nConnectIndex = 1;
}
else
{
if(nConnectIndex!=0)
nConnectIndex = -1;
}
// prima chiamata, effettua la connessione
if(nConnectIndex < 0)
{
// disabilita il bottone Connect e trasforma Exit in Cancel
DisablePropertySheetOkButton();
SetPropertySheetCancelButton(IDCANCEL_CANCEL_PROMPT);
nConnectIndex = 0;
while((p = (char*)m_pAsyncSocket->ParseIPRange(m_strConnectHostAddr,m_strConnectHostAddr))!=NULL)
pIpAddress = p;
m_strConnectHostAddr = pIpAddress;
UpdateData(FALSE);
strcpyn(tcpscan.ip,m_strConnectHostAddr,IP_ADDRESS_SIZE+1);
tcpscan.port = m_nConnectHostPort;
TCPSCAN* t = &tcpscan;
// effettua il collegamento all'host/porta specificati
if(m_pAsyncSocket->Open())
{
strBuffer.Format("connecting to %s:%d...",tcpscan.ip,tcpscan.port);
SetTitle(strBuffer);
//m_pAsyncSocket->SetSocketTimeout(10);
m_pAsyncSocket->AsyncConnect(t->ip,t->port);
}
else
{
// apertura fallita, invia autonomamente il messaggio
int nWSAError = m_pAsyncSocket->GetWSAErrorNumber();
static char szWSAString[128];
strcpyn(szWSAString,m_pAsyncSocket->GetWSAErrorString(),sizeof(szWSAString));
::PostMessage(this->m_hWnd,WM_ASYNCCONNECT,nWSAError,MAKELPARAM(LOWORD(szWSAString),HIWORD(szWSAString)));
strBuffer.Format("error: %s",szWSAString);
SetTitle(strBuffer);
}
}
else // chiamate successive
{
BOOL bConnected = (BOOL)((int)wParam==0);
if(!bConnected)
{
if(m_pAsyncSocket->IsWSAError(wParam))
{
strBuffer.Format("%s:%d error: %s",tcpscan.ip,tcpscan.port,m_pAsyncSocket->GetWSAErrorString());
SetTitle(strBuffer);
AfxMessageBox(strBuffer,MB_ICONWARNING);
}
m_pAsyncSocket->Close();
strBuffer.Format("%s:%d: connection closed",tcpscan.ip,tcpscan.port);
SetTitle(strBuffer);
AfxMessageBox(strBuffer,MB_ICONINFORMATION);
// abilita il bottone Connect e trasforma Cancel in Exit
SetPropertySheetOkButton(m_pConnectButtonText);
EnablePropertySheetOkButton();
SetPropertySheetCancelButton(IDCANCEL_EXIT_PROMPT);
LeavePageBusyState(IDD_PAGE_CONNECT);
nConnectIndex = -1;
}
else
{
if(nConnectIndex==0)
{
// abilita il bottone Send e trasforma Exit in Cancel
SetPropertySheetOkButton(m_pSendButtonText);
EnablePropertySheetOkButton();
SetPropertySheetCancelButton(IDCANCEL_CANCEL_PROMPT);
nConnectIndex = -1;
}
else
{
UpdateData(TRUE);
if(m_strHostSend.GetLength() > 0)
{
m_pAsyncSocket->SetData(m_strHostSend);
if(m_pAsyncSocket->Send() < 0)
::PostMessage(this->m_hWnd,WM_ASYNCCLOSE,0,0);
}
}
}
SetTitle(PROGRAM_NAME);
}
return(0L);
}
/*
OnRead()
Chiamata dal socket per la ricezione dei dati.
*/
LONG CConnectPage::OnRead(UINT /*wParam*/,LONG /*lParam*/)
{
while(m_pAsyncSocket->Receive() > 0)
m_strHostRecv += m_pAsyncSocket->GetData();
// aggiorna i campi della pagina
UpdateData(FALSE);
// per posizionarsi alla fine
CEdit* pCEdit = (CEdit*)GetDlgItem(IDC_EDIT_RECV);
if(pCEdit)
pCEdit->LineScroll(pCEdit->GetLineCount());
return(0L);
}
/*
OnWrite()
Chiamata dal socket per l'invio dei dati.
*/
LONG CConnectPage::OnWrite(UINT /*wParam*/,LONG /*lParam*/)
{
if(m_strHostSend.GetLength() > 0)
{
m_pAsyncSocket->SetData(m_strHostSend);
m_pAsyncSocket->Send();
}
return(0L);
}
/*
OnClose()
Chiamata dal socket per la chiusura.
*/
LONG CConnectPage::OnClose(UINT /*wParam*/,LONG /*lParam*/)
{
m_pAsyncSocket->Close();
// aggiorna il testo dei bottoni dello sheet
SetPropertySheetOkButton(m_pConnectButtonText);
EnablePropertySheetOkButton();
SetPropertySheetCancelButton(IDCANCEL_EXIT_PROMPT);
AfxMessageBox("Connection closed by the remote host.",MB_ICONINFORMATION);
LeavePageBusyState(IDD_PAGE_CONNECT);
return(0L);
}
/*
DDV_...()
*/
/*
void AFXAPI DDV_ValidateIP(CDataExchange* pDX,int nIDC,CString& cIpAddr)
{
pDX->PrepareEditCtrl(nIDC);
if(pDX->m_bSaveAndValidate)
if(cIpAddr.GetLength() <= 0 || cIpAddr.GetLength() > HOSTNAME_SIZE)
{
AfxMessageBox("Must enter a valid ip string.",MB_ICONWARNING);
pDX->Fail();
}
}
void AFXAPI DDV_ValidatePortNumber(CDataExchange* pDX,int nIDC,unsigned int& iPort)
{
pDX->PrepareEditCtrl(nIDC);
if(pDX->m_bSaveAndValidate)
if(iPort < 0 || iPort >= UINT_MAX)
{
AfxMessageBox("Must enter a valid port number.",MB_ICONWARNING);
pDX->Fail();
}
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -