Информационно-вычислительная сеть на основе технологии клиент-сервер, предметная область: "Диски"

Курсовой проект - Компьютеры, программирование

Другие курсовые по предмету Компьютеры, программирование

p>

Рисунок 2 - запуск сервера

 

Рисунок 3 - сервер готов к работе

 

Рисунок 4 - подключение к серверу

Рисунок 5 - клиент получил данные

 

Рисунок 6

 

Рисунок 7 - работа с несколькими клиентами

Заключение

 

Разработано клиент-серверное приложение для передачи данных. Программа написана на языке С++ в среде программирования MS Visual Studio. Тестирование показало правильность работы приложения. Разработка и тестирование производились в ОС Windows XP на ПК с процессором Athlon.

 

Список использованной литературы

 

MSDN Library. Copyright 1995-2000 Microsoft Corporation.

Зинкин С.А. Курс лекций по курсу Сети ЭВМ и телекоммуникации

Компьютерные сети. Принципы, технологии, протоколы / В.Г. Олифер, Н.А. Олифер.-СПб.: Питер, 2002.

Сети ЭВМ: протоколы, стандарты, интерфейсы / Ю. Блэк; перев. с англ. - М.: Мир, 1990.

А. Мешков, Ю. Тихомиров Visual C++ и MFC - 2 издание, BHV - Санкт-Петербург, 1999г.

 

Приложения

 

Приложение А

 

Листинг программного текста

Сервер

#include "stdafx.h"

#include "lip_server.h"

#include "MainFrm.h"

#include "lip_serverDoc.h"

#include "lip_serverView.h"

#include "ParamDlg.h"

#include "global.h"

#include "..\crypt.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILEchar THIS_FILE[] = __FILE__;

#endif_MESSAGE_MAP(CLip_serverApp, CWinApp)

//{{AFX_MSG_MAP(CLip_serverApp)_COMMAND(ID_APP_ABOUT, OnAppAbout)

// NOTE - the ClassWizard will add and remove mapping macros here.

// DO NOT EDIT what you see in these blocks of generated code!

//}}AFX_MSG_MAP

// Standard file based document commands_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew)_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen)_MESSAGE_MAP()_serverApp::CLip_serverApp()

{

// TODO: add construction code here,

// Place all significant initialization in InitInstance

}_serverApp theApp;CLip_serverApp::InitInstance()

{(!AfxSocketInit())

{(IDP_SOCKETS_INIT_FAILED);FALSE;

OpenEx(NULL,0);=newCRecordset(pLipDB);=false;(WaitingForConnect,NULL);">}d(NULL);(d.DoModal() == IDOK) {= d.m_Port;= d.m_Password;= new CDatabase();>OpenEx(NULL, 0);= new CRecordset(pLipDB);= false;(WaitingForConnect, NULL);

}false;

#ifdef _AFXDLLdControls();// Call this when using MFC in a shared DLL

#elsedControlsStatic();// Call this when linking to MFC statically

#endif(_T("Local AppWizard-Generated Applications"));(0); // Load standard INI file options (including MRU)* pDocTemplate;= new CSingleDocTemplate(_MAINFRAME,_CLASS(CLip_serverDoc),_CLASS(CMainFrame), // main SDI frame window_CLASS(CLip_serverView));(pDocTemplate);

// Parse command line for standard shell commands, DDE, file opencmdInfo;(cmdInfo);

// Dispatch commands specified on the command line(!ProcessShellCommand(cmdInfo))FALSE;

// The one and only window has been initialized, so show and update it._pMainWnd->ShowWindow(SW_SHOW);_pMainWnd->UpdateWindow();TRUE;

}CLip_serverApp::ExitInstance()

{(pLipRec) {>Close();pLipRec;

}(pLipDB) {>Close();pLipDB;

}CWinApp::ExitInstance();

}CAboutDlg : public CDialog

{:();

// Dialog Data

//{{AFX_DATA(CAboutDlg){ IDD = IDD_ABOUTBOX };

//}}AFX_DATA

// ClassWizard generated virtual function overrides

//{{AFX_VIRTUAL(CAboutDlg):void DoDataExchange(CDataExchange* pDX); // DDX/DDV support

//}}AFX_VIRTUAL

// Implementation:_MESSAGE_MAP()

};::CAboutDlg() : CDialog(CAboutDlg::IDD)

{

}CAboutDlg::DoDataExchange(CDataExchange* pDX)

{::DoDataExchange(pDX);

}_MESSAGE_MAP(CAboutDlg, CDialog)_MESSAGE_MAP()

// App command to run the dialogCLip_serverApp::OnAppAbout()

{aboutDlg;.DoModal();

}WaitingForConnect( LPVOID pParam)

{

SOCKET MySocket;// основное гнездо - на которое принимаются соединения

sockaddr_inMySocketAdress;// структура данных гнездаnewSocket;// гнездо, на которое перенаправляются соединения

inta;= socket(AF_INET, SOCK_STREAM, 0); // создать гнездо

if(MySocket == INVALID_SOCKET)

{ // в случае неудачи - выдать сообщение и выйти

// cout<<endl<<"socket(...) error "<<WSAGetLastError()<<endl;0;

}.sin_family = AF_INET; // заполнение структуры данных.sin_port = htons(port);.sin_addr.s_addr = htonl(INADDR_ANY);(bind(MySocket, (sockaddr*) &MySocketAdress,(MySocketAdress)) == SOCKET_ERROR) // получение локального адреса

{ // в случае неудачи - выдать сообщение, закрыть гнездо и выйти

// cout<<endl<<"bind(...) error "<<WSAGetLastError()<<endl;(MySocket);0;

}(listen(MySocket, 5) == SOCKET_ERROR) // перевести гнездо в состояние ожидания

{

// cout<<endl<<"listen(...) error "<<WSAGetLastError()<<endl;(MySocket);0;

}(1) {= sizeof(sockaddr_in);= accept(MySocket, (sockaddr*)&MySocketAdress, &a); // принять соединение(newSocket == INVALID_SOCKET)

{

//cout<<endl<<"accept(...) error "<<WSAGetLastError()<<endl;(MySocket);0;

}

/*= sizeof(sockaddr_in);(getpeername(sw, (sockaddr*)&MySocketAdress, &a) != SOCKET_ERROR)

// попытаться получить адрес клиента

cout<<"accepted connection from "<<inet_ntoa(sa.sin_addr)<<endl;

*/

// запустить в отдельной нити функцию обслуживания клиента

if(!AfxBeginThread(ConnectHandler, (void*) newSocket))

{

//cout<<endl<<"_beginthread(...) error "<<errno<<endl;(MySocket);0;

}

}(MySocket);0;

}ConnectHandler( LPVOID pParam)

{s = (SOCKET) pParam;// гнездо, с которым будет вестись обменbuf[500], // буферы для данных[500], // буфер для шифрованного текста

pwd[21]; // парольlen[4];str;n, nFields;(pwd, password.operator LPCTSTR(), 20);

recv(s, len, sizeof len, 0); // прием данных от клиента= recv(s, encrypted, (int) len, 0); // прием данных от клиента

crypt(encrypted, buf, pwd, n);(n < 1) {(s); // закрытие гнезда0;

Open(AFX_DB_USE_DEFAULT_TYPE,buf);=pLipRec->GetODBCFieldCount();(n!=0||nFields>0){(s,(char*)&nFields,sizeofnFields,0);(inti=0;iGetODBCFieldInfo(i, LipField);= crypt(LipField.m_strName.operator LPCTSTR(),, pwd, LipField.m_strName.GetLength() + 1);(s, (char*)&n, sizeof n, 0);(s, encrypted, n, 0);

}>MoveFirst();(!pLipRec->IsEOF())

{(int i = 0; i < nFields; i++)

GetFieldValue(i,str);=crypt(str,encrypted,pwd,str.GetLength()+1);(s,(char*)&n,sizeofn,0);(s,encrypted,n,0);">{>GetFieldValue(i, str);= crypt(str, encrypted, pwd, str.GetLength() + 1);(s, (char*)&n, sizeof n, 0);(s, encrypted, n, 0);

}>MoveNext( );(!pLipRec->IsEOF())[0] = 1;[0] = 0;(s, len, 1, 0);

}>Close();

}{= 0;(s, (char*)&nFields, sizeof nFields, 0);

}= false;(s, len, sizeof len, 0); // прием данных от клиента= recv(s, encrypted, (int) len, 0); // прием данных от клиента(encrypted, buf, pwd, n);

} while (n > 0);(s); // закрытие гнезда0;

}

#include "stdafx.h"

#include "crypt.h"

#include

// функция преобразования строки пароля в гамму шифра

unsigned long gamma(char *pwd)

{buf[20];i;long flag;unsigned long g;(pwd) {