Программа просмотра свободного места на жестком диске сервера
Рефераты >> Коммуникации и связь >> Программа просмотра свободного места на жестком диске сервера

1. Задание……………………………………………………… 3

2. Используемые сетевые сообщения……………………3

3. Основные функции программы…………………………4

4. Диаграмма процессов…………………………………… .5

5. Работа программы………………………………………….6

6. Текст программы…………………………………………….7

1. Задание.

Разработать приложения клиент - сервер для отправки данных о наличии свободного места на жестком диске сервера с использованием UDP протокола. Клиент «активный», сервер «пассивный».

2. Используемые сетевые сообщения.

В программе использованы следующие 5 видов пакетов:

1) «установки соединения». Запрос соединения. (Connect)

2) «установки соединения». Ответ на запрос соединения. (Accept)

3) «ожидание-проверка соединения». Периодическая проверка наличия соединения. (Ping)

4) «запрос информации у сервера». Запрос данных о свободном пространстве на диске. (Info (i))

5) «получения информации от сервера». Периодическая отправка данных о свободном месте на диске. (Info (r))

Пакеты 1) – 5) имеют следующий формат.

union packd {

char buff[63]; // буфер

struct pack p; // данные

};

где

struct pack{

char action; // Тип пакета

DWORD t; // t - Число свободных килобайт

} ar;

3. Основные функции, используемые в программе.

ü void ServerStop; (остановка сервера)

ü void initme; (создание сокета сервера, клиента, ожидание соединения на всех сетевых интерфейсах)

ü bool clientconnect; (создание потока соединения клиента с сервером)

ü void StartServer; (создание и запуск потока сервера )

ü DWORD WINAPI ThreadAction_put, DWORD WINAPI ThreadAction_cl, DWORD WINAPI ThreadAction_serv; (потоки клиента и сервера обработки данных)

ü void drawme; (обновление полей таблицы с данными о свободном месте за последние секунды)

ü CHAR * get_error_text(int code), void err(char * pl); (проверка типа ошибки и формирование соответствующего коду предупреждения о ней)

ü GetDiskFreeSpace; (получение информации о количестве свободного места на диске)

4. Диаграмма процессов.

5. Работа программы.

6. Текст программы.

#include "stdafx.h"

#include "resource.h"

#include <winsock2.h>

#include <math.h>

#include <stdlib.h>

#include <stdio.h>

#define MAX_LOADSTRING 100

/*

* Client interaction routine data

*/

struct pack{

char action;

DWORD t;

} ar;

DWORD space, ss[5];

union packd {

char buff[63];

struct pack p;

};

int tr = 0, trd = 0;

/*

* socket address type converter routine

*/

void err(char * pl);

void drawme(HWND hWnd);

void ServerStop(HWND hWnd);

HINSTANCE hInst; // current instance

TCHAR szTitle[MAX_LOADSTRING]; // The title bar text

TCHAR szWindowClass[MAX_LOADSTRING]; // The title bar text

// Foward declarations of functions included in this code module:

ATOM MyRegisterClass(HINSTANCE hInstance);

BOOL InitInstance(HINSTANCE, int);

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

LRESULT CALLBACK About(HWND, UINT, WPARAM, LPARAM);

bool iamserv = false, started = false, iamclient = false, alive = false;

SOCKET s,s_cl=0;

SOCKADDR_IN dest_sin;

struct sockaddr_in caddr; struct sockaddr_in saddr; struct sockaddr_in local_cl;

HANDLE thread, thread_cl, thread_put;

#define SERV_PORT 55555

#define CLNT_PORT 55556

struct timeval tv;

HANDLE finished, finished_cl, finished_draw,finished_put;

CHAR * get_error_text(int code) {

switch (code) {

case (WSANOTINITIALISED): return "Winsock was not initialized";

case (WSAENETDOWN): return "Network subsystem failed";

case (WSAEADDRINUSE): return "local addres already used";

case (WSAEINTR): return "call cancelled";

case (WSAEINPROGRESS): return "operation in progress";

case (WSAEALREADY): return "already connecting";

case (WSAEADDRNOTAVAIL): return "local address not available";

case (WSAEAFNOSUPPORT): return "address family not supported";

case (WSAECONNREFUSED): return "connection refused (port closed)";

case (WSAEFAULT): return "memory access violation";

case (WSAEINVAL): return "invalid socket operation";

case (WSAEISCONN): return "already connected";

case (WSAENETUNREACH): return "network unreachable";

case (WSAENOBUFS): return "no buffer space available";

case (WSAENOTSOCK): return "not a socket";

case (WSAETIMEDOUT): return "timeout";

case (WSAEWOULDBLOCK): return "socket nonblocking, but operation blocks";

case (WSAEACCES): return "broadcast address given";

}

return "Unknown error";

}

PTHREAD_DATA dt=NULL;

DWORD WINAPI ThreadAction_serv(LPVOID param) {

union packd p;

memset(&p,0,sizeof(p));

struct sockaddr_in addr;

addr.sin_addr.s_addr = INADDR_ANY;

int size = sizeof(caddr),tmp = -1,e, suc;

fd_set rfds;

struct timeval tv;

HWND hWnd = HWND(param);

FD_ZERO(&rfds);

FD_SET(s, &rfds);

tv.tv_sec = 8192;

tv.tv_usec = 0;

char szDir[4];

szDir[0] = TEXT('C');

szDir[1] = TEXT(':');

szDir[2] = TEXT('\\');

szDir[3] = 0;

DWORD lpSectorsPerCluster;

DWORD lpBytesPerSector;

DWORD lpNumberOfFreeClusters;

DWORD lpTotalNumberOfClusters;

int retval = select(1, &rfds, NULL, NULL, &tv);

while (retval) {

e = recvfrom(s,p.buff, sizeof(p.buff)+1,0,(sockaddr*)&caddr,&size);

if (addr.sin_addr.s_addr == INADDR_ANY) {addr.sin_addr.s_addr = caddr.sin_addr.s_addr;};

if ((addr.sin_addr.s_addr != INADDR_ANY) &&

addr.sin_addr.s_addr != caddr.sin_addr.s_addr ) {

MessageBox(NULL,"Wrong client","At server got: ",MB_OK);

} else {

alive = true;

}

caddr.sin_port = htons(CLNT_PORT);

switch(p.p.action){

case('p'):

e = sendto(s_cl, p.buff, sizeof(p)+1,0,(PSOCKADDR)&caddr, sizeof(caddr));

if (e == -1) err("serv ping send");

started = true;

break;

case('i'):

suc = GetDiskFreeSpace(szDir,&lpSectorsPerCluster,

&lpBytesPerSector,

&lpNumberOfFreeClusters,

&lpTotalNumberOfClusters);

space = lpSectorsPerCluster * lpBytesPerSector / 1024 *


Страница: