CATEGORII DOCUMENTE |
Lucrare pentru obtinerea atestatului la informatica
Colegiul National B.P.Hasdeu
mai 2003
Hash hidden software
TransferIt - Transfer de fisiere pe Internet
Proiect de atestat
transferit
Manualul utilizatorului
a Hash Technologies
Cuprins
Capitolul I - Informatii generale
Ce este si ce face TransferIt 2
Interfata 2
Capitolul II - Detalii tehnice
Cum a fost realizat TransferIt 4
Cerinte de sistem 4
Transferul 4
Viteza de transfer 4
Capitolul III - CoduL sursa
TransferItDlg.cpp 6
AsyncSockIface.h 11
AsyncSockIface.cpp 12
Capitolul 1 |
Ce este si ce face TransferIt?
TransferIt este un program simplu de utilizat ce faciliteaza transferul de fisiere de la un calculator la altul.
t |
ransferIt va ajuta daca vreti sa faceti schimburi de fisiere cu colegii, daca vreti sa copiati fisiere de pe un calculator pe altul fara sa folositi dischete sau CD-uri.
Interfata a fost gandita
pentru a fi usor de folosit, chiar si de utilizatorii neexperimentati. De aceea
simplitatea este pe primul loc. Fereastra principala este impartita
in doua parti; AcTion, si StatUs.
Prima parte permite alegerea intre trimiterea si acceptarea de fisiere iar a doua afiseaza informatii despre starea curenta a programului: Idle, Listening, Sending sau Accepting, in ultimele doua cazuri afisandu-se si date despre viteza de transfer si procentul din date ce a fost deja trimis/primit.
Pentru a alege sa primiti fisiere trebuie doar sa apasati pe Asteapta send-uri. Acum cand cineva folosind programul va scrie adresa dumneavoastra in casuta Destinatie vi se va prezenta o caseta de dialog pentru salvarea fisierului trimis.
Pentru a trimite un fisier apasati
butonul Browse sau scrieti direct
calea catre fisier, scrieti adresa calculatorului destinatie si apasati
pe Trimite. Veti fi avertizat daca
apar erori la trimitere iar in caz contrar se va confirma trimiterea cu succes.
&
Pentru a afla ip-ul sau hostname-ul unui calculator
folositi programul winipcfg sau
ipconfig (winipcfg nu exista
in toate versiunile de Windows)
Capitolul 2 |
Cum a fost realizat TransferIt
Visual C++ .NET, MFC, WinSock API
P |
rogramul utilizat pentru scrierea lui TransferIt a fost Visual C++, acesta asigurand in mare parte viteza, flexibilitatea si ergonomia produsului final. Link-area statica asigura portabilitatea maxima a programului prin includerea in executabil a codului din librarii, nefiind necesare dll-uri suplimentare cum se intampla la alte limbaje de programare mai putin robuste. MFC-ul a fost utilizat ca framework iar partea de retea este suportata de clasa CAsyncSocket ce incapsuleaza API-ul WinSock. Codul sursa va clarifica aceste notiuni
Cerintele de sistem sunt minime, practic fiind nevoie doar de un calculator ce ruleaza Windows 9x, 2K sau XP conectat la o retea.
Transferul efectiv se face creand un server pe portul 19872 ce va astepta conexiuni. Odata detectata, conexiunea va fi preluata si utilizatorul intrebat daca accepta fisierul respectiv.
Viteza de transfer este dependenta de conexiunea dintre cele doua calculatoare iar la limita, de viteza mediilor pe care se stocheaza fisierele. Astfel, pe o linie dial-up se poate ajunge pana la 5-6KB/s iar intr-un LAN se poate ajunge la o viteza de cativa MB/s.
Capitolul 3 |
Codul sursa
Codul sursa este modularizat; el se afla in 6 fisiere ce alcatuiesc 3 clase, doua generate automat de framework si una specializata in comunicarea in retea
Clasa derivata din CWinApp este standard, modificarile fiind minore, de aceea n-o voi mai include aici. Voi prezenta numai partile importante din clasa responsabila de caseta de dialog (derivata din CDialog) si din cea responsabila de partea de retea (derivata din CAsyncSocket)
Fisier: TransferItDlg.cpp
..
void CTransferItDlg::OnBnClickedButtonBrowse()
}
void CTransferItDlg::OnBnClickedButtonSend()
else
CloseHandle(hReadFile); hReadFile = NULL;
xfer.Close();
if (!xfer.Create())
MessageBox('Eroare la creare socket-ului', 'Eroare', MB_OK | MB_ICONERROR);
xfer.RegisterForCallbacks(this, UM_SOCKETMSG2);
if (xfer.Connect(m_szHost, DEF_PORT) == SOCKET_ERROR && WSAGetLastError() != WSAEWOULDBLOCK) else
}
}
void CTransferItDlg::OnBnClickedButtonListen()
else
MessageBox('Error creating server', 'Error', MB_OK | MB_ICONERROR);
} else
GetDlgItem(IDC_EDIT_PATH)->EnableWindow(TRUE);
GetDlgItem(IDC_EDIT_HOST)->EnableWindow(TRUE);
GetDlgItem(IDC_BUTTON_BROWSE)->EnableWindow(TRUE);
GetDlgItem(IDC_BUTTON_SEND)->EnableWindow(TRUE);
(GetDlgItem(IDC_BUTTON_LISTEN))->SetWindowText('&Asteapta send-uri');
m_chAction = 'i';
}
}
LRESULT CTransferItDlg::OnListenMsg(WPARAM wParam, LPARAM lParam)
return 0;
}
LRESULT CTransferItDlg::OnSocketMsg(WPARAM wParam, LPARAM lParam)
else
xfer.Send(szCtrlMsg, sizeof(szCtrlMsg));
m_bNewConnection = FALSE;
} else
}
break;
case FD_CLOSE:
xfer.Close();
m_chAction = 'i';
if (xf && m_dwBytesRS == xf->dwFileSize) else
m_dwBytesRS = 0;
if (xf)
if (hSaveFile)
listener.Create(DEF_PORT);
listener.RegisterForCallbacks(this, UM_LISTENER);
listener.Listen();
m_chAction = 'l';
break;
}
return 0;
}
BOOL bCanWrite, transmit_again;
LRESULT CTransferItDlg::OnSocketMsg2(WPARAM wParam, LPARAM lParam)
KillTimer(2);
hReadFile = CreateFile(m_szPath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
pxf = (PXFILE)malloc(sizeof(XFILE) + m_szFileTitle.GetLength());
pxf->dwFileSize = GetFileSize(hReadFile, NULL);
pxf->dwSize = sizeof(XFILE) + m_szFileTitle.GetLength();
strcpy(pxf->szFileName, m_szFileTitle);
m_chAction = 's';
xfer.Send(pxf, pxf->dwSize);
break;
case FD_READ:
/*
o sa primim mesaje de genul '0x0' unde x e o cifra
semnificatia este:
0 - am primit numele fisierului, continua
1 - am primit numele fisierului, utilizatorul a anulat transferul
2 - am primit tot fisierul, inchide conexiunea
*/
xfer.Receive(szRemoteMsg, sizeof(szRemoteMsg));
if (szRemoteMsg[2] == 0 && szRemoteMsg[0] == '0')
}
break;
case FD_CLOSE:
SenderCleanup();
break;
case FD_WRITE:
if (bCanWrite) StartSending();
break;
}
return 0;
}
void CTransferItDlg::StartSending()
}
if (xfer.Send(byteBuffer, dwBytesRead) == SOCKET_ERROR)
else
} else
}
}
void CTransferItDlg::SenderCleanup()
if (hReadFile)
m_dwBytesRS = 0;
bCanWrite = FALSE;
transmit_again = FALSE;
GetDlgItem(IDC_EDIT_PATH)->EnableWindow(TRUE);
GetDlgItem(IDC_EDIT_HOST)->EnableWindow(TRUE);
GetDlgItem(IDC_BUTTON_BROWSE)->EnableWindow(TRUE);
GetDlgItem(IDC_BUTTON_LISTEN)->EnableWindow(TRUE);
GetDlgItem(IDC_BUTTON_SEND)->SetWindowText('&Trimite');
}
void CTransferItDlg::OnTimer(UINT nIDEvent)
switch (m_chAction)
fSpeed = (m_dwBytesRS - dwLastBytesRS) / 1000.0;
dwLastBytesRS = m_dwBytesRS;
if (xf) dwTimeLeft = (DWORD)((dwKFileSize - dwKBytesRS) / (60 * fSpeed));
else dwTimeLeft = 55;
strMessage.Format('Am primit %uKB din %uKB (%.2f%%) Viteza: %.2fKB/srnTimp pana la incheiere: %u min', dwKBytesRS, dwKFileSize, fPercent, fSpeed, dwTimeLeft);
break;
case 's':
dwKBytesRS = m_dwBytesRS / 1000;
if (pxf)
strMessage.Format('Am trimis %uKB din %uKB (%.2f%%)', dwKBytesRS, dwKFileSize, fPercent);
break;
case 'l':
strMessage = 'Astept conexiuni';
break;
}
m_ctrlStatic.SetWindowText(strMessage);
CDialog::OnTimer(nIDEvent);
}
Fisier: AsyncSockIface.h
#pragma once
#include <afxsock.h>
// CAsyncSockIface command target
class CAsyncSockIface : public CAsyncSocket
;
Fisier: AsyncSockIface.cpp
// AsyncSockIface.cpp : implementation file
//
#include 'stdafx.h'
#include 'AsyncSockIface.h'
// CAsyncSockIface
CAsyncSockIface::CAsyncSockIface()
CAsyncSockIface::~CAsyncSockIface()
// CAsyncSockIface member functions
BOOL CAsyncSockIface::Create(UINT nSocketPort, int nSocketType,
long lEvent, LPCTSTR lpszSocketAddress)
void CAsyncSockIface::RegisterForCallbacks(CWnd* pTargetWnd, UINT uNotifyMsg)
void CAsyncSockIface::OnConnect(int nErrorCode)
void CAsyncSockIface::OnAccept(int nErrorCode)
void CAsyncSockIface::OnReceive(int nErrorCode)
void CAsyncSockIface::OnSend(int nErrorCode)
void CAsyncSockIface::OnClose(int nErrorCode)
{
if (m_bWantNotify)
m_pTargetWnd->SendMessage(m_uNotifyMsg, 0, MAKELONG(FD_CLOSE, nErrorCode));
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 1939
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved