Lập trình windows với MFC Micrisoft visual C++6.0- P12
lượt xem 22
download
Brush : Công cụ tô màu. Font : Công cụ qui định kiểu ký tự cho nội dung văn bản. Bitmap : Công cụ quản lý vùng ảnh điểm. Palette : Công cụ quản lý bộ màu hiển thị. Region : Công cụ quản lý vùng hiển thị có dạng bất kỳ.
Bình luận(0) Đăng nhập để gửi bình luận!
Nội dung Text: Lập trình windows với MFC Micrisoft visual C++6.0- P12
- - n SocketType : AÁn ñònh giao thöùc söû duïng; SOCK_STREAM cho int nLevel = SOL_SOCKET TCP hoaëc SOCK_DGRAM cho UDP. BOOL Listen ( - lEvent : int nConnectionBacklog = 5 // Chieàu daøi doøng chôø keát noái Bao goàm caùc thoâng soá lieân quan ñeán caùc bieán coá truyeàn thoâng maø öùng duïng muoán winsock phaûn hoài ); Chôø nhaän keát noái töø host ñoái taùc (server chôø caùc clients). ngay treân socket quaûn lyù bôûi ñoái töôïng socket. BOOL Connect ( LPCTSTR lpszHostAddress, // Ñòa chæ num.dot cuûa host ñoái taùc FD_READ : Nhaän ñöôïc thoâng tin. UINT nHostPort FD_WRITE : Göûi ñöôïc thoâng tin. // Soá hieäu port treân host ñoái taùc FD_ACCEPT : Ñoàng yù keát noái. ); Xin keát noái vôùi host ñoái taùc (clients keát noái vôùi server). FD_CONNECT : Ñeà nghò keát noái. BOOL Connect ( const SOCKADDR* lpSockAddr, // Ñòa chæ socket host ñoái taùc FD_CLOSE : Chaám döùt keát noái. int nSockAddrLen // Kích thöôùc lpSockAddr FD_OOB : Thoâng tin ngoaøi tuyeán. - lpszSocketAddress : Chuoãi chöùa ñòa chæ num-dot cuûa host ñoái taùc maø ); Xin keát noái vôùi host ñoái taùc (clients keát noái vôùi server). socket ñöôïc keát (bind). INADDR_ANY laø ñòa chæ virtual BOOL Accept ( CAsyncSocket& rConnectedSocket, duøng keát vôùi taát caû caùc host trong heä thoáng maïng. SOCKADDR* lpSockAddr = NULL, BOOL Bind ( UINT nSocketPort, int* lpSockAddrLen = NULL // Soá hieäu port LPCTSTR lpszSocketAddress = NULL // Ñòa chæ num-dot cuûa host ); Chaáp nhaän keát noái vôùi host ñoái taùc (server chaáp nhaän keát noái client). ); Keát socket vôùi moät host xaùc ñònh. Trong ñoù: - rConnectedSocket : Bieán chöùa ñoái töôïng socket ñöôïc taïo môùi vôùi BOOL Bind ( const SOCKADDR* lpSockAddr, // Ñòa chæ socket host ñoái taùc caùc ñaëc tính gioáng nhö ñoái töôïng chuû theå vaø int nSockAddrLen // Kích thöôùc lpSockAddr duøng ñeå quaûn lyù lieân keát vöøa thieát laäp. - lpSockAddr : ); Keát socket vôùi moät host xaùc ñònh. Ñòa chæ bieán kieåu SOCKADDR ñöôïc duøng ñeå BOOL SetSockOpt ( nhaän ñòa chæ host ñoái taùc. int nOptionName, - lpSockAddrLen : Ñòa chæ bieán ñöôïc duøng ñeå nhaän kích thöôùc cuûa // Thuoäc tính caàn aán ñònh const void* lpOptionValue, ñòa chæ traû veà trong lpSockAddr. // Ñòa chæ bieán chöùa giaù trò aán ñònh int nOptionLen, // Kích thöôùc bieán chöùa giaù trò virtual int Send ( // Söû duïng cho Stream Socket int nLevel = SOL_SOCKET // Möùc ñaët thoâng soá cho socket const void* lpBuf, // Ñòa chæ vuøng ñeäm chöùa döõ lieäu truyeàn int nBufLen, ); AÁn ñònh ñaëc tính hoaït ñoäng cuûa socket. // Kích thöôùc vuøng ñeäm nOptionName cho pheùp löïa choïn thuoäc tính aán ñònh cuûa socket : int nFlags = 0 // Thoâng soá aán ñònh ñaëc tính göûi - SO_BROADCAST : BOOL → Göûi message ñeán moïi host. ); Göûi döõ lieäu thoâng qua moät socket ñöôïc keát noái. - SO_DONTROUTE : BOOL → Göûi tröïc tieáp khoâng qua router. Thoâng soá duøng cho ñaëc tính göûi: Ví duï: Neáu aán ñònh ñaëc tính cuûa socket laø cho pheùp göûi message ñeán - MSG_DONTROUTE = Göûi thaúng khoâng qua router. - MSG_OOB = Göûi ngoaïi tuyeán (khaån caáp) moïi host thì haønh vi treân ñöôïc thöïc hieän vôùi tham soá nhö sau: int nOptionName, int SendTo ( // Söû duïng cho Datagram = SO_BROADCAST const void* lpBuf, const void* lpOptionValue, = Ñòa chæ bieán luaän lyù baèng TRUE // Vuøng ñeäm döõ lieäu int nBufLen, int nOptionLen, // Kích thöôùc vuøng ñeäm = sizeof (BOOL) MFC vôùi Internet 202 Laäp trình Windows vôùi MFC - Microsoft Visual C++ 6.0 - Leâ Ngoïc Thaïnh - lntmail@yahoo.com 201
- UINT nHostPort, // Soá hieäu port ñoái taùc virtual void OnConnect ( LPCTSTR lpszHostAddress = NULL, // Ñòa chæ num-dot ñoái taùc int nErrorCode // Maõ loãi int nFlags = 0 // Ñaëc tính göûi. ); Nhaän ñöôïc yeâu caàu xin keát noái cuûa host ñoái taùc. ); Göûi packet ñeán host ñoái taùc. Haøm traû veà soá bytes döõ lieäu göûi ñöôïc. virtual void OnAccept ( Ñeå göûi packet ñeán taát caû caùc host, ñaët lpszHostAddress = NULL. int nErrorCode // Maõ loãi, = 0 is OK int SendTo ( // Söû duïng cho Datagram ); Nhaän ñöôïc söï ñoàng yù keát noái cuûa host ñoái taùc. const void* lpBuf, // Nhö treân … virtual void OnSend ( int nBufLen, int nErrorCode const SOCKADDR* lpSockAddr, // Ñòa chæ socket ñoái taùc ); Socket ñaõ saün saøng cho vieäc göûi döõ lieäu. int nSockAddrLen, // Kích thöôùc ñòa chæ virtual void OnReceive ( int nFlags = 0 int nErrorCode ); Göûi packet ñeán host ñoái taùc. Haøm traû veà soá bytes döõ lieäu ñöôïc göûi. ); Döõ lieäu ñaõ saün saøng chôø nhaän thoâng qua socket. Ñeå göûi packet ñeán taát caû caùc host, giaù trò ñòa chæ ñoái taùc ñaët nhö sau: virtual void OnOutOfBandData ( lpSockAddr->sin_addr.s_addr = htonl ( INADDR_BROADCAST ); int nErrorCode virtual int Receive ( // Söû duïng cho Stream Socket ); Coù döõ lieäu khaån caáp saün saøng chôø nhaän thoâng qua socket. void* lpBuf, // Ñòa chæ vuøng ñeäm nhaän döõ lieäu virtual void OnClose ( int nBufLen, int nErrorCode // Kích thöôùc vuøng ñeäm int nFlags = 0 // Ñaëc tính nhaän döõ lieäu. ); Socket chuaån bò chaám döùt hoaït ñoäng. ); Nhaän döõ lieäu thoâng qua moät socket ñöôïc keát noái. BOOL ShutDown ( int nHow int ReceiveFrom ( // Söû duïng cho Datagram // 0 = receive, 1 = send ; 2 = both void* lpBuf, // Ñòa chæ vuøng ñeäm chöùa döõ lieäu ); Chaám döùt taùc vuï truyeàn thoâng töông öùng treân socket. int nBufLen, // Kích thöôùc vuøng ñeäm virtual void Close( ); Huûy boû socket. CString& rSocketAddress, // Ñòa chæ num-dot ñoái taùc 13.4 LAÄP TRÌNH WINSOCK CHO GIAO THÖÙC UDP: UINT& rSocketPort, // Soá hieäu port ñoái taùc Trong phaàn naøy ta söû duïng giao thöùc UDP ñeå thöïc hieän truyeàn thoâng ñieäp int nFlags = 0 // Ñaëc tính göûi giöõa hai hay nhieàu host. ÖÙng duïng thieát keá cho pheùp ngöôøi duøng soaïn thaûo ); Nhaän döõ lieäu töø host ñoái taùc. noäi dung thoâng ñieäp, tuøy yù choïn göûi ñeán host xaùc ñònh hoaëc taát caû caùc host. int ReceiveFrom ( // Söû duïng cho Datagram void* lpBuf, // Ñòa chæ vuøng ñeäm chöùa döõ lieäu int nBufLen, // Kích thöôùc vuøng ñeäm SOCKADDR* lpSockAddr, // Ñòa chæ socket ñoái taùc int* lpSockAddrLen, // Kích thöôùc ñòa chæ int nFlags = 0 // Ñaëc tính göûi ); Nhaän döõ lieäu töø host ñoái taùc. Caùch thöïc hieän nhö sau: BOOL AsyncSelect ( long lEvent = FD_READ | FD_WRITE | Duøng MFC Wizard taïo döï aùn Udp vôùi cöûa soå giao dieän chính laø dialog. FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE ); ÔÛ böôùc ‘Step 2 of 4’: Choïn hoã trôï Windows Sockets: Ñaêng kyù bieán coá truyeàn thoâng mong muoán (xem Create ). MFC vôùi Internet 204 Laäp trình Windows vôùi MFC - Microsoft Visual C++ 6.0 - Leâ Ngoïc Thaïnh - lntmail@yahoo.com 203
- } - Haønh vi huûy boû thöïc hieän giaûi phoùng vuøng nhôù ñaõ xin caáp phaùt: CEmpUdp::~CEmpUdp() { delete m_Buffer; } - Haønh vi keá thöøa OnSend laáy thoâng tin nhaäp trong hoäp nhaäp coù soá hieäu laø IDC_EDIT cuûa dialog lieân quan vaø thöïc hieän göûi ñeán host (neáu ñòa chæ xaùc ñònh) hoaëc göûi cho taát caû host treân maïng: void CEmpUdp::OnSend(int nErrorCode) { CString peerAddr; m_Parent->GetDlgItemText(IDC_EDIT, m_Buffer, BUF_LEN); ((CUDPDlg*)m_Parent)->m_ip.GetWindowText(peerAddr); if (peerAddr == "0.0.0.0") { // Send to everyones BOOL toAll = TRUE; SetSockOpt (SO_BROADCAST, &toAll, sizeof(BOOL)); SendTo(m_Buffer, BUF_LEN, RECEIV_PORT); } Choïn Finish hoaøn ñeå hoaøn taát vieäc khôûi taïo döï aùn. else Tieáp tuïc thöïc hieän caùc boå sung sau : SendTo(m_Buffer, BUF_LEN, RECEIV_PORT, peerAddr); Boå sung lôùp CEmpUdp keá thöøa lôùp CAsyncSocket cuûa MFC. Thöïc hieän } caùc caøi ñaët cho lôùp nhö sau: - Haønh vi keá thöøa OnReceive nhaän thoâng tin göûi ñeán vaø hieån thò trong - Khai baùo caùc haèng, soá hieäu port söû duïng trong öùng duïng: hoäp thoâng baùo coù soá hieäu laø IDC_READ cuûa dialog lieân quan: // Chieàu daøi vuøng ñeäm void CEmpUdp::OnReceive(int nErrorCode) const BUF_LEN = 512; // port göûi thoâng tin { const SENT_PORT = 2051; // Ñòa chæ host ñoái taùc vaø // port nhaän thoâng tin CString peerAddr; const RECEIV_PORT = 2050; // soá hieäu port söû duïng - Caùc ñoái töôïng thuoäc tính söû duïng trong lôùp: UINT port; // Vuøng ñeäm chöùa thoâng tin nhaän-göûi ReceiveFrom(m_Buffer, BUF_LEN, peerAddr, port); char *m_Buffer; *m_Parent; // Con troû ñoái töôïng dialog lieân quan sprintf (m_Buffer, "%s\n(from %s)", m_Buffer, peerAddr ); CDialog - Haønh vi khôûi taïo cuûa lôùp nhaän tham soá laø con troû ñoái töôïng dialog m_Parent->SetDlgItemText ( IDC_READ, m_Buffer ); giao dieän lieân quan; thöïc hieän löu giaù trò con troû vaøo thuoäc tính cuûa // Duy trì vieäc nhaän thoâng tin AsyncSelect(FD_READ); lôùp vaø ñaêng kyù vuøng nhôù laøm vuøng ñeäm nhaän-göûi thoâng tin: } Môû resource cuûa dialog giao dieän, boå sung hoäp edit (IDC_EDIT) cho CEmpUdp::CEmpUdp(CDialog *parent) { pheùp nhaäp noäi dung thoâng tin göûi, hoäp thoâng baùo (IDC_READ) hieån thò m_Parent = parent; thoâng tin nhaän, vaø hoäp nhaäp IP vôùi bieán m_IP duøng nhaäp ñòa chæ IP. m_Buffer = new char[BUF_LEN + 1]; MFC vôùi Internet 206 Laäp trình Windows vôùi MFC - Microsoft Visual C++ 6.0 - Leâ Ngoïc Thaïnh - lntmail@yahoo.com 205
- Thöïc hieän caùc boå sung cho lôùp CUDPDlg quaûn lyù dialog giao dieän: CSocket sockSrvr; CSocket sockClient; - Khai baùo caùc ñoái töôïng thuoäc tính quaûn lyù socket nhaän vaø göûi thoâng // Taïo socket 1,2 // Taïo socket 2 tin cuûa öùng duïng: sockSrvr.Create(nPort); sockClient.Create( ); // Chôø nhaän keát noái // Quaûn lyù socket göûi thoâng tin CEmpUdp *m_sentUDP; CEmpUdp *m_receivUDP; // Quaûn lyù socket nhaän thoâng tin sockSrvr.Listen( ); // Xin pheùp keát noái 3,4 - Haønh vi OnInitDialog: Caáp phaùt vaø khôûi taïo thoâng soá cho caùc ñoái töôïng CEmpUdp: sockClient.Connect(strAddr,nPort); // Chuaån bò socket keát noái m_sentUDP = new CEmpUdp(this); CSocket sockRecv; m_receivUDP = new CEmpUdp(this); // Ñoàng yù keát noái 5 m_sentUDP->Create(SENT_PORT, SOCK_DGRAM, 0); sockSrvr.Accept( sockRecv ); m_receivUDP->Create(RECEIV_PORT,SOCK_DGRAM,FD_READ); // Truyeàn döõ lieäu 6 . // Truyeàn döõ lieäu 6 . - Haønh vi OnOK (töông öùng nuùt choïn OK) thöïc hieän göûi thoâng ñieäp: ... ... void CUDPDlg::OnOK() // Keát thuùc keát noái 7 . { sockClient.Close() m_sentUDP->AsyncSelect(FD_WRITE); // Ñaêng kyù göûi sockSrvr.Close(); } Caùch thöïc hieän: Bieân dòch vaø chaïy thöû öùng duïng. Taïo taäp döï aùn roãng (Blank Workspace): 13.5 LAÄP TRÌNH WINSOCK CHO GIAO THÖÙC TCP: - Choïn muïc File / New Trong phaàn naøy, ta söû duïng giao thöùc TCP ñeå thöïc hieän truyeàn döõ lieäu laø noäi dung cuûa moät taäp tin. Vieäc truyeàn döõ lieäu dieãn ra giöõa host quaûn lyù noäi dung taäp tin : server vaø host nhaän noäi dung taäp tin : client. - Thöïc hieän caùc aán ñònh nhö treân. Choïn OK. Boå sung vaøo Workspace döï aùn TcpServer. Ñaây laø döï aùn cuûa öùng duïng server coù nhieäm vuï chôø keát noái vaø cung caáp döõ lieäu cho caùc client. Thöù töï thöïc hieän caùc taùc vuï keát noái vaø truyeàn döõ lieäu giöõa host server vaø - Trong maøn hình Worksapce, right-click treân muïc Workspace. host client nhö sau: Server Client // Khai baùo socket // Khai baùo socket MFC vôùi Internet 208 Laäp trình Windows vôùi MFC - Microsoft Visual C++ 6.0 - Leâ Ngoïc Thaïnh - lntmail@yahoo.com 207
- static BOOL fileReady = FALSE; static CFile file; static long total; BUFFER buf; // Ñaõ keát noái m_isBusy = TRUE; // Döõ lieäu nhaän thöïc söï buf.length = 0; if ( fileOK && (!fileReady) ) { m_Parent->SetDlgItemText(IDC_INFO, "\nTransfering..."); fileReady = TRUE; // Teân taäp tin ñöôïc göûi CString fileName; - Choïn Add New Project to Workspace. // IDC_FILE : Soá hieäu hoäp nhaäp teân taäp tin treân dialog - Duøng Wizard taïo döï aùn TcpServer vôùi giao dieän chính laø dialog, vaø m_Parent->GetDlgItemText(IDC_FILE, fileName); coù söû duïng windows socket. Caùch thöïc hieän töông töï (13.4). fileOK = file.Open(fileName, CFile::modeRead); Thöïc hieän caùc coâng vieäc sau cho döï aùn TcpServer : // Chöùa kích thöôùc thoâng tin göûi total = 0; Boå sung lôùp CEmpTcpWriter keá thöøa CAsyncSocket cuûa MFC. Lôùp boå } sung naøy ñaûm nhaän caùc chöùc naêng truyeàn noäi dung taäp tin cho client if (!fileOK || ñöôïc keát noái (OnSend), vaø chaám döùt keát noái khi ñaõ truyeàn xong ( buf.length = file.Read( buf.info, BUFFER_LEN ) ) (Close). Caøi ñaët cuûa lôùp CEmpTcpWriter nhö sau: < BUFFER_LEN ) // Khoâng coù file hoaëc ñaõ göûi heát - Khai baùo kieåu caáu truùc cho vuøng ñeäm chöùa döõ lieäu göûi: fileReady = FALSE; const BUFFER_LEN = 1024; // Kích thöôùc vuøng chöùa döõ lieäu Send( &buf, BUFFER_LEN + sizeof(int) ); total += buf.length; typedef struct _tagBuf { if (fileReady) { // Kích thöôùc döõ lieäu thöïc int length; // Thôøi gian nghæ cho client Sleep( 300 ); char info[BUFFER_LEN]; // Vuøng chöùa döõ lieäu AsyncSelect( FD_WRITE ); // Göûi tieáp } BUFFER; } - Caùc thuoäc tính protected: else { m_isBusy; // Traïng thaùi phuïc vuï. BOOL if ( fileOK ) file.Close(); CDialog* m_Parent; // Ñoái töôïng dialog lieân quan Close(); // Saün saøng nhaän döõ lieäu - Haønh vi taïo laäp nhaän tham soá laø con troû ñoái töôïng dialog lieân quan, m_isBusy = FALSE; vaø xaùc ñònh traïng thaùi saün saøng: CString result; result.Format( "\nReady to connect to clients !\n" CEmpTcpWriter::CEmpTcpWriter( CDialog* parent ) "%d (bytes) transfered completed", total ); { m_Parent->SetDlgItemText( IDC_INFO, result ); // Ñoái töôïng dialog lieân quan m_Parent = parent; } // Saün saøng nhaän döõ lieäu m_isBusy = FALSE; } } Boå sung lôùp CEmpTcpServer keá thöøa CAsyncSocket ñaûm nhaän caùc - Haønh vi OnSend thöïc hieän göûi döõ lieäu cho client lieân keát: chöùc naêng nhaän keát noái (accept), vaø khôûi taïo ñoái töôïng göûi döõ lieäu: void CEmpTcpWriter::OnSend( int nErrorCode ) - Caùc thuoäc tính protected cuûa lôùp CEmpTcpServer: { CEmpTcpWriter* m_pDoSendObject; // Ñoái töôïng göûi döõ lieäu static BOOL fileOK = TRUE; MFC vôùi Internet 210 Laäp trình Windows vôùi MFC - Microsoft Visual C++ 6.0 - Leâ Ngoïc Thaïnh - lntmail@yahoo.com 209
- // Xaùc ñònh ñòa chæ IP cuûa server host // Dialog lieân quan CDialog* m_Parent; - Haønh vi taïo laäp nhaän tham soá laø con troû ñoái töôïng dialog lieân quan: char name[1024]; gethostname( name, 1024 ); CEmpTcpServer::CEmpTcpServer( CDialog* parent ) PHOSTENT phost = gethostbyname( name ); { SetDlgItemText( IDC_HOSTIP, // Con troû ñoái töôïng dialog lieân quan m_Parent = parent; inet_ntoa(*(in_addr*)phost->h_addr) ); m_pDoSendObject = new CEmpTcpWriter( m_Parent ); m_Tcp = new CEmpTcpServer( this ); } // Khôûi taïo thoâng soá m_Tcp->Create( PORT_NO ); - Haønh vi huûy boû giaûi phoùng ñoái töôïng m_pDoSendObject: // Chôø keát noái m_Tcp->Listen(); CEmpTcpServer::~CEmpTcpServer( ) return TRUE; { } delete m_pDoSendObject; - Haønh vi OnDestroy thöïc hieän giaûi phoùng ñoái töôïng truyeàn thoâng } void CTcpServerDlg::OnDestroy() - Haønh vi OnAccept chaáp nhaän keát noái neáu ñang roãi: { void CEmpTcpServer::OnAccept( int nErrorCode ) CDialog::OnDestroy(); { delete m_Tcp; if ( m_pDoSendObject->m_isBusy ) } // Ñang baän phuïc vuï return ; Taïo döï aùn TcpClient. Thao taùc töông töï döï aùn TcpServer. SOCKADDR_IN Addr; Thöïc hieän caùc coâng vieäc sau ñaây vôùi döï aùn TcpClient : int Len = sizeof(SOCKADDR_IN); Boå sung lôùp CEmpTcpReader keá thöøa CAsyncSocket ñaûm nhaän chöùc if (Accept(*m_pDoSendObject, (SOCKADDR*) &Addr, &Len)) naêng xin keát noái (Connect), vaø nhaän döõ lieäu (OnReceive) töø server: // Khôûi ñoäng hoaït ñoäng göûi döõ lieäu treân m_pDoSendObject - Thuoäc tính public chöùa traïng thaùi truyeàn thoâng: m_pDoSendObject->AsyncSelect(FD_WRITE); BOOL m_isBusy; // = TRUE : Ñang baän } Thöïc hieän caùc caøi ñaët boå sung cho lôùp ñoái töôïng dialog CTcpServerDlg - Thuoäc tính protected chöùa con troû ñoái töôïng dialog lieân quan: laøm giao dieän chính cuûa öùng duïng server: CDialog* m_Parent; - Môû dialog resource, caøi ñaët caùc control sau: - Haønh vi taïo laäp nhaän tham soá laø ñoái töôïng dialog lieân quan: - Hoäp nhaäp teân taäp tin : Edit Soá hieäu IDC_FILE CEmpTcpReader::CEmpTcpReader(CDialog* parent) - Hoäp hieån thò traïng thaùi heä thoáng : Static IDC_INFO { - Hoäp hieån thò IP cuûa host laøm server : Static IDC_HOSTIP m_isBusy = FALSE; // Saün saøng laøm vieäc - Ñoái töôïng thuoäc tính protected laøm nhieäm vuï truyeàn thoâng: m_Parent = parent; CEmpTcpServer* m_Tcp; } - Haønh vi OnReceive nhaän döõ lieäu vaø löu xuoáng taäp tin: - Haønh vi OnInitDialog cuûa dialog khôûi taïo thoâng soá cho dialog vaø caùc thoâng soá caàn thieát cho hoaït ñoäng truyeàn thoâng vôùi m_Tcp: void CEmpTcpReader::OnReceive(int nErrorCode) { BOOL CTcpServerDlg::OnInitDialog() static BOOL fileOK = TRUE; { static BOOL fileReady = FALSE; CDialog::OnInitDialog(); SetIcon( m_hIcon, TRUE ); static CFile file; SetDlgItemText( IDC_FILE, "C:/AUTOEXEC.BAT" ); static long total; MFC vôùi Internet 212 Laäp trình Windows vôùi MFC - Microsoft Visual C++ 6.0 - Leâ Ngoïc Thaïnh - lntmail@yahoo.com 211
- - Nuùt leänh download taäp tin töø server : Button IDOK BUFFER buf; - Taïo thuoäc tính bieán m_serverIP cho hoäp nhaäp IDC_HOSTIP. Receive(&buf, BUFFER_LEN + sizeof(int)); - Ñoái töôïng thuoäc tính protected laøm nhieäm vuï truyeàn thoâng: if ( fileOK && (!fileReady) ) { CEmpTcpReader *m_readTcp; m_Parent->SetDlgItemText(IDC_INFO, "\nDownloading..."); - Haønh vi OnInitDialog cuûa dialog khôûi taïo thoâng soá cho dialog vaø fileReady = TRUE; // Teân taäp tin chöùa döõ lieäu nhaän caùc thoâng soá caàn thieát cho hoaït ñoäng truyeàn thoâng vôùi m_readTcp: CString fileName; // IDC_FILE : Soá hieäu hoäp nhaäp teân taäp tin treân dialog BOOL CTcpClientDlg::OnInitDialog() m_Parent->GetDlgItemText( IDC_FILE, fileName ); { fileOK = file.Open ( fileName, CDialog::OnInitDialog(); CFile::modeWrite | CFile::modeCreate ); SetIcon(m_hIcon, TRUE); // Set big icon // Kích thöôùc döõ lieäu nhaän ñöôïc SetIcon(m_hIcon, FALSE); // Set small icon total = 0; } m_serverIP.SetWindowText( "127.0.0.1" ); // local host if ( fileOK && buf.length > 0 ) { SetDlgItemText( IDC_FILE, "C:/Autoexec.000" ); file.Write( buf.info, buf.length ); m_readTcp = new CEmpTcpReader( this ); total += buf.length; return TRUE; if ( buf.length < BUFFER_LEN ) } // Ñaõ nhaän ñuû döõ lieäu töø server fileReady = FALSE; - Haønh vi OnDestroy giaûi phoùng ñoái töôïng truyeàn thoâng: } void CTcpClientDlg::OnDestroy() else { fileReady = FALSE; CDialog::OnDestroy(); if (fileReady) delete m_readTcp; CAsyncSocket::OnReceive(nErrorCode); // Nhaän tieáp } - Haønh vi OnOK öùng vôùi nuùt choïn download baét ñaàu nhaän döõ lieäu: else { // Trôû laïi traïng thaùi saün saøng @ m_isBusy = FALSE; void CTcpClientDlg::OnOK() Close(); { if (fileOK) file.Close(); CString s; CString result; m_serverIP.GetWindowText(s); result.Format( "\nReady to connect to server !\n" if ( m_readTcp->m_isBusy || s == "0.0.0.0" ) return; "%d (bytes) download completed.", total ); m_readTcp->m_isBusy = TRUE; // Traïng thaùi baän @ m_Parent->SetDlgItemText(IDC_INFO, result); m_readTcp->Create(); } m_readTcp->Connect(s, PORT_NO); } } Bieân dòch caùc döï aùn vaø thöû nghieäm treân moät hoaëc nhieàu maùy. Thöïc hieän caùc caøi ñaët boå sung cho lôùp ñoái töôïng dialog CTcpClientDlg Choïn muïc : Project / Set Active Project ñeå aán ñònh döï aùn laøm vieäc laøm giao dieän chính cuûa öùng duïng client: trong taäp döï aùn (Workspace) nhö tröôøng hôïp noùi treân. - Môû dialog resource, caøi ñaët caùc control sau: Söû duïng CSocket vaø CSocketFile cho taùc vuï truyeàn taäp tin noùi treân. - Hoäp nhaäp teân taäp tin : Edit IDC_FILE - Hoäp hieån thò traïng thaùi heä thoáng : Static IDC_INFO - Hoäp nhaäp ñòa chæ IP cuûa server : IPControl IDC_HOSTIP MFC vôùi Internet 214 Laäp trình Windows vôùi MFC - Microsoft Visual C++ 6.0 - Leâ Ngoïc Thaïnh - lntmail@yahoo.com 213
- Lôùp CSocket: Sau khi nhaän ñöôïc tín hieäu traû lôøi nhö treân töø öùng duïng nhaän mail, CSocket laø lôùp keá thöøa CAsyncSocket maø caùc haønh vi göûi vaø nhaän öùng duïng göûi mail tieáp tuïc thöïc hieän caùc taùc vuï sau ñaây theo thöù töï. döõ lieäu cuûa noù töï ñoäng thöïc hieän cô cheá chôø cho taùc vuï tröôùc ñoù hoaøn ‘Trình dieän’ vôùi öùng duïng nhaän mail: taát. Nhö vaäy, seõ khoâng gaëp loãi taùc vuï ngheõn (WSAEWOULDBLOCK) Göûi: HELO khi thöïc hieän truyeàn döõ lieäu vôùi CSocket. Ñieàu naøy raát quan troïng vôùi Trong ñoù: SP : Kyù töï khoaûng traéng caùc öùng duïng truyeàn taûi döõ lieäu coù kích thöôùc lôùn nhö öùng duïng (13.5). CRLF : \r\n // return & newline in C Trong phaàn noäi dung tieáp theo, CSocket seõ ñöôïc söû duïng ñeå thay theá Nhaän: OK : 250 BBN-UNIX.ARPA cho CAsyncSocket trong caùc ví duï minh hoïa. ERROR : Soá hieäu loãi (keát noái bò töø choái). Neáu nhaän ñöôïc traû lôøi “250 ” töø öùng duïng nhaän mail, 13.6 TCP VÔÙI SMTP (SIMPLE MAIL TRANSFER PROTOCOL): öùng duïng göûi mail coù theå tieáp tuïc caùc coâng vieäc keá tieáp. SMTP laø giao thöùc ñôn giaûn vaø hieäu quaû cho vieäc truyeàn taûi e-mail töø host göûi ñeán host nhaän mail; ví duï töø moät mail client ñeán moät mail server. Quaù Ñaêng kyù ñòa chæ ngöôøi göûi mail: trình truyeàn taûi mail ñöôïc thöïc hieän treân cô sôû thieát laäp moät keânh lieân laïc hai Göûi: MAIL FROM: chieàu giöõa hai host. Host göûi laàn löôït phaùt caùc chæ thò keát noái vaø göûi döõ lieäu. Nhaän: OK : 250 OK Host nhaän tieáp nhaän döõ lieäu vaø traû lôøi ñeå host göûi coù cô sôû xaùc ñònh thao taùc ERROR : Ñaêng kyù khoâng ñöôïc chaáp nhaän keát thuùc. thích hôïp keá tieáp. Moâ hình hoaït ñoäng truyeàn taûi mail giöõa hai host nhö sau: Ñaêng kyù ñòa chæ ngöôøi nhaän mail: Neáu mail ñöôïc göûi cho nhieàu ñòa chæ thì thöïc hieän thao taùc naøy nhieàu laàn cho caùc ñòa chæ nhaän ñoù. Göûi: RCPT TO: Nhaän: OK : 250 OK ERROR : 550 Failure Info Chuaån bò truyeàn noäi dung cuûa mail: Göûi: DATA Nhaän: OK : 354 Intermediate reply Khi nhaän ñöôïc yeâu caàu cuûa ngöôøi duøng, host göûi phaùt tín hieäu ñeán host ERROR : 550 Failure nhaän ñeå xin keát noái. Truyeàn noäi dung cuûa mail: Coù theå laëp nhieàu laàn thao taùc sau ñaây tuøy Moãi khi nhaän ñöôïc moät xaùc nhaän ñoàng yù cuûa host nhaän, host göûi tieáp theo soá ñoaïn vaên baûn trong noäi dung cuûa mail. tuïc chuyeån phaàn noäi dung keá tieáp cuûa mail. Göûi: Noäi dung ñoaïn vaên baûn thöù (i) cuûa mail Quaù trình treân keát thuùc khi mail ñaõ göûi xong hoaëc coù söï traû lôøi vôùi noäi Nhaän: Khoâng coù traû lôøi cuûa host nhaän. dung töø choái töø phía host nhaän. Chaám döùt truyeàn noäi dung cuûa mail: Göûi: . 13.6.1 Qui öôùc giao taùc giöõa öùng duïng göûi mail vaø öùng duïng nhaän mail: Nhaän: 250 OK Thieát laäp lieân keát: Ñaàu tieân, öùng duïng göûi mail treân host göûi söû duïng Keát thuùc keát noái vôùi host nhaän: giao thöùc TCP keát noái vôùi öùng duïng nhaän mail treân host nhaän thoâng qua Göûi: QUIT ñòa chæ IP cuûa host nhaän vaø soá hieäu port cuûa öùng duïng nhaän mail. Nhaän: 221 Terminated Info Göûi: Môû socket vaø lieân laïc vôùi öùng duïng nhaän mail (port = 25). Nhaän: 220 ready Chaám döùt lieân keát giöõa hai öùng duïng göûi mail vaø nhaän mail. 13.6.2 Thieát keá öùng duïng göûi mail: MFC vôùi Internet 216 Laäp trình Windows vôùi MFC - Microsoft Visual C++ 6.0 - Leâ Ngoïc Thaïnh - lntmail@yahoo.com 215
- Trong phaàn naøy, ta xaây döïng öùng duïng söû duïng giao thöùc TCP ñeå keát noái void CSMTPDlg::OnOK() vaø göûi mail leân moät mail server. Noäi dung mail vaø caùc aán ñònh lieân quan ñöôïc { theå hieän treân dialog giao dieän chính cuûa öùng duïng. char s[1025]; UINT port; Duøng MFC Wizard taïo döï aùn vôùi cöûa soå giao dieän chính laø dialog, coù söû CSocket m_sock; duïng winsock (xem muïc 13.4). Ñaët teân cho döï aùn laø SMTP. GetDlgItemText(IDC_SERVER_IP, s, 1024); Thöïc hieän caùc caøi ñaët sau ñaây cho dialog giao dieän (CSMTPDlg): port = GetDlgItemInt(IDC_SERVER_PORT); - Môû dialog resource, caøi ñaët caùc control sau: - Hoäp nhaäp ñòa chæ mail server m_sock.Create(); : Edit IDC_SERVER_IP if (!m_sock.Connect(s, port)) return; - Hoäp nhaäp soá hieäu port : Edit IDC_SERVER_PORT - Hoäp nhaäp ñòa chæ ngöôøi nhaän : Edit IDC_MAIL_TO if (!m_sock.Receive(s, 1024) || GetErrorCode(s) != 220) return; - Hoäp nhaäp tieâu ñeà cuûa mail : Edit IDC_MAIL_SUBJECT - Hoäp soaïn thaûo noäi dung mail : Edit IDC_MAIL strcpy(s, "HELO Mr.Emp\r\n"); m_sock.Send(&s, strlen(s)); - Nuùt leänh thöïc hieän göûi mail : Button IDOK if (!m_sock.Receive(s, 1024) || GetErrorCode(s) != 250) - Haønh vi OnInitDialog thöïc hieän caùc khôûi taïo caàn thieát: return; BOOL CSMTPDlg::OnInitDialog() // Ñòa chæ ngöôøi göûi { strcpy(s, "MAIL FROM:Mr.Emp\r\n"); CDialog::OnInitDialog(); m_sock.Send(&s, strlen(s)); SetIcon(m_hIcon, TRUE); if (!m_sock.Receive(s, 1024) || GetErrorCode(s) != 250) SetIcon(m_hIcon, FALSE); return; SetDlgItemText(IDC_SERVER_IP, "omail.hcmueco.edu.vn"); // Ñòa chæ ngöôøi nhaän SetDlgItemText(IDC_SERVER_PORT, "25"); strcpy(s, "RCPT TO:"); SetDlgItemText(IDC_MAIL_TO, "emp@hcmueco.edu.vn"); GetDlgItemText(IDC_MAIL_TO, s + strlen(s), 1024); SetDlgItemText(IDC_MAIL_SUBJECT, strcpy(s + strlen(s), "\r\n"); "A Lesson of Mr.Emp"); m_sock.Send(&s, strlen(s)); SetDlgItemText(IDC_MAIL, "Hello Mr.Emp!\r\n\r\n" if (!m_sock.Receive(s, 1024) || GetErrorCode(s) == 550) "It's nice to meet You.\r\n\r\n" return; "Thanks for your lessons."); // Chuaån bò truyeàn noäi dung mail return TRUE; strcpy(s, "DATA\r\n"); } m_sock.Send(&s, strlen(s)); - Haønh vi kieåm tra loãi treân giaù trò nhaän ñöôïc töø öùng duïng nhaän mail: if (!m_sock.Receive(s, 1024) || GetErrorCode(s) != 354) Caøi ñaët haønh vi protected: GetErrorCode cho lôùp CSMTPDlg: return; UINT CSMTPDlg::GetErrorCode(char *sReply) // Chuû ñeà mail { strcpy(s, "Subject:"); UINT rs = 0; GetDlgItemText(IDC_MAIL_SUBJECT, s + strlen(s), 1024); sscanf(sReply, "%d", &rs); strcpy(s + strlen(s), "\r\n"); // Traû veà soá hieäu loãi ghi trong döõ lieäu nhaän ñöôïc return rs; m_sock.Send(&s, strlen(s)); } // Noäi dung mail - Haønh vi OnOK öùng vôùi nuùt choïn IDOK thöïc hieän göûi mail: MFC vôùi Internet 218 Laäp trình Windows vôùi MFC - Microsoft Visual C++ 6.0 - Leâ Ngoïc Thaïnh - lntmail@yahoo.com 217
- -ERR error_message keát thuùc. GetDlgItemText(IDC_MAIL, s, 1024); Sau khi ñaêng nhaäp thaønh coâng, coù theå tuøy yù thöïc hieän caùc coâng vieäc sau: sprintf(s, "%s%s", s, "\r\n"); Laáy thoâng tin veà hoäp mail: m_sock.Send(&s, strlen(s)); Göûi: STAT // Keát thuùc Nhaän: +OK strcpy(s, "\r\n.\r\n"); -ERR error_message m_sock.Send(&s, strlen(s)); Laáy thoâng tin chi tieát cuûa caùc mail trong hoäp mail: strcpy(s, "QUIT\r\n"); Göûi: LIST m_sock.Send(&s, strlen(s)); Nhaän: +OK Mailbox scan listing follows m_sock.Close(); -ERR error_message MessageBox("The Mail was sent OK !", "Send mail"); Ñoïc mail: } Göûi: RETR 13.7 TCP VÔÙI POP3 (Post Office Protocol - Version 3): Nhaän: +OK kích_thöôùc_message octets POP3 laø giao thöùc cho pheùp mail client host keát noái vôùi mail server host ñeå … message do mail server göûi veà, keát thuùc bôûi daáu ‘.’ laáy thoâng tin veà hoäp mail cuûa ngöôøi duøng treân mail server. Hoaït ñoäng truy -ERR error_message xuaát naøy nhaèm taûi mail cuûa ngöôøi duøng veà client host vaø xoùa mail aáy khoûi Xoùa mail: hoäp mail cuûa hoï treân mail server. Töông töï SMTP, quaù trình taûi mail töø server Göûi: DELE cuûa POP3 ñöôïc thöïc hieän treân cô sôû thieát laäp moät keânh lieân laïc hai chieàu giöõa Nhaän: +OK message deleted client vaø server. Client göûi laàn löôït göûi caùc chæ thò keát noái vaø nhaän döõ lieäu. -ERR error_message Mail server tieáp nhaän yeâu caàu cuûa client vaø traû lôøi hoaëc göûi döõ lieäu. Chaám döùt lieân keát vôùi mail server: 13.7.1 Qui öôùc giao taùc giöõa hai öùng duïng mail client vaø mail server: Göûi: QUIT Thieát laäp lieân keát: Ñaàu tieân, öùng duïng mail client söû duïng giao thöùc Nhaän: + OK goodbye_message TCP keát noái vôùi öùng duïng mail server thoâng qua ñòa chæ IP cuûa mail - ERR error_message server host vaø soá hieäu port cuûa öùng duïng mail server. 13.7.2 Thieát keá öùng duïng nhaän mail: Göûi: Môû socket vaø lieân laïc vôùi öùng duïng mail server (port=110). Trong phaàn naøy, ta xaây döïng öùng duïng söû duïng giao thöùc TCP ñeå keát noái Nhaän: +OK ok_message vaø laáy mail töø moät POP mail server. Thoâng soá lieân quan mail server vaø thoâng -ERR error_message tin nhaän ñöôïc seõ ñöôïc theå hieän treân dialog giao dieän chính cuûa öùng duïng. Sau khi nhaän ñöôïc tín hieäu traû lôøi ‘OK’ töø öùng duïng mail server, öùng Duøng MFC Wizard taïo döï aùn vôùi cöûa soå giao dieän chính laø dialog, coù söû duïng mail client tieáp tuïc thöïc hieän caùc taùc vuï sau theo thöù töï. duïng winsock (xem muïc 13.4). Ñaët teân cho döï aùn laø POP3. Ñaêng kyù taøi khoaûn truy caäp mail server: Thöïc hieän caùc caøi ñaët sau cho dialog giao dieän chính (CPOP3Dlg): Khai baùo user name: - Môû dialog resource, caøi ñaët caùc control sau: Göûi: USER - Hoäp nhaäp ñòa chæ mail server : Edit IDC_SERVER_IP Nhaän: +OK ok_message - Hoäp nhaäp soá hieäu port : Edit IDC_SERVER_PORT -ERR error_message keát thuùc. - Hoäp nhaäp teân ngöôøi truy caäp : Edit IDC_USER_NAME Khai baùo password: - Hoäp nhaäp password truy caäp : Edit IDC_USER_PASSWORD Göûi: PASS Nhaän: +OK ok_message MFC vôùi Internet 220 Laäp trình Windows vôùi MFC - Microsoft Visual C++ 6.0 - Leâ Ngoïc Thaïnh - lntmail@yahoo.com 219
CÓ THỂ BẠN MUỐN DOWNLOAD
-
Lập trình windows với MFC Micrisoft visual C++6.0- P1
10 p | 273 | 96
-
Lập trình windows với MFC Micrisoft visual C++6.0- P2
10 p | 216 | 69
-
Lập trình windows với MFC Micrisoft visual C++6.0- P10
10 p | 165 | 46
-
Lập trình windows với MFC Micrisoft visual C++6.0- P3
10 p | 203 | 45
-
Lập trình windows với MFC Micrisoft visual C++6.0- P13
10 p | 161 | 40
-
Lập trình windows với MFC Micrisoft visual C++6.0- P5
10 p | 168 | 33
-
Lập trình windows với MFC Micrisoft visual C++6.0- P9
10 p | 139 | 33
-
Lập trình windows với MFC Micrisoft visual C++6.0- P6
10 p | 157 | 30
-
Lập trình windows với MFC Micrisoft visual C++6.0- P4
10 p | 104 | 30
-
Lập trình windows với MFC Micrisoft visual C++6.0- P11
10 p | 123 | 30
-
Lập trình windows với MFC Micrisoft visual C++6.0- P8
10 p | 108 | 25
-
Lập trình windows với MFC Micrisoft visual C++6.0- P7
10 p | 101 | 19
Chịu trách nhiệm nội dung:
Nguyễn Công Hà - Giám đốc Công ty TNHH TÀI LIỆU TRỰC TUYẾN VI NA
LIÊN HỆ
Địa chỉ: P402, 54A Nơ Trang Long, Phường 14, Q.Bình Thạnh, TP.HCM
Hotline: 093 303 0098
Email: support@tailieu.vn