Программа просмотра свободного места на жестком диске сервераРефераты >> Коммуникации и связь >> Программа просмотра свободного места на жестком диске сервера
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 *