Scrigroup - Documente si articole

     

HomeDocumenteUploadResurseAlte limbi doc
AccessAdobe photoshopAlgoritmiAutocadBaze de dateCC sharp
CalculatoareCorel drawDot netExcelFox proFrontpageHardware
HtmlInternetJavaLinuxMatlabMs dosPascal
PhpPower pointRetele calculatoareSqlTutorialsWebdesignWindows
WordXml


TransferIt - Transfer de fisiere pe Internet

internet



+ Font mai mare | - Font mai mic



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


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

Cerinte de sistem

Cerintele de sistem sunt minime, practic fiind nevoie doar de un calculator ce ruleaza Windows 9x, 2K sau XP conectat la o retea.

Transferul

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

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



DISTRIBUIE DOCUMENTUL

Comentarii


Vizualizari: 1939
Importanta: rank

Comenteaza documentul:

Te rugam sa te autentifici sau sa iti faci cont pentru a putea comenta

Creaza cont nou

Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved