АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Узагальнений алгоритм тестування

Читайте также:
  1. IV. Алгоритм действий командира (начальника) при увольнении военнослужащего в связи с невыполнением им условий контракта
  2. LZW-модификация алгоритма Лемпеля-Зива
  3. Zip–модификация алгоритма Лемпеля-Зива
  4. А.3.3. Алгоритм медикаментозного лікування
  5. Алгоритм
  6. АЛГОРИТМ
  7. Алгоритм
  8. Алгоритм
  9. Алгоритм 1.11. Пошук невідкладних дій (перша медична допомога) симптоматичної допомоги при гострих струєннях.
  10. Алгоритм 1.4. Діагностичний і лікувальний (перша медична допомога) пошук при гіпертонічній кризі
  11. Алгоритм 2.4. Транспортна іммобілізація
  12. Алгоритм First Come First Served (FCFS)
  1. Сервер створює сокет та відсилає запит на сервер Whois;
  2. Сервер Whois отримує запит та обробляє його:

2.1. Якщо у базі даних сервера потрібного домену нема, то сервер зв’язується із іншими серверами;

2.2. Сервер надсилає відомості про доменне ім’я клієнту;

 

  1. Клієнт отримує відомості про домен та виводить їх на екран;
  2. Сокет знищується.

 

 

Схема алгоритму програми-клієнта

 

З’єднання із сервером:

1. Якщо поле введення не заповнене, то виводити повідомлення про помилку

// if(! SendDlgItemMessage(hDlg, 100, WM_GETTEXT, 256, (LPARAM)szName))

{

MessageBox(hDlg, "Nothing specified in Name field!", "WinWho",

MB_OK | MB_ICONEXCLAMATION);

return(FALSE);

}

 

2. Якщо сервер не встановлено, виводиться повідомлення про помилку

// if(! SendDlgItemMessage(hDlg, 102, WM_GETTEXT, 256, (LPARAM)szHost)) /

{

MessageBox(hDlg, "No WhoIs Server Specified (try Change)", "WinWho",

MB_OK | MB_ICONEXCLAMATION);

return(FALSE);

}

3.Встановлення вікон

// EnableWindow(GetDlgItem(hDlg, IDOK), FALSE);

EnableWindow(GetDlgItem(hDlg, 103), FALSE);

 

4. Якщо не вдається з’єднатися із сервером Whois, вивід повідомлення про помилку

// if(! phe) {

MessageBox(hDlg, "Unable to locate specified Server!", "WinWho",

MB_OK | MB_ICONEXCLAMATION);

EnableWindow(GetDlgItem(hDlg, IDOK), TRUE);

EnableWindow(GetDlgItem(hDlg, 103), TRUE);

return(FALSE);

}

  1. Якщо сокет вірний, заповнення даних з’єднання для сервера

// if(s!= INVALID_SOCKET)

{

bAddr = *phe->h_addr_list;

sin.sin_family = AF_INET;

sin.sin_port = htons(IPPORT_WHOIS);

sin.sin_addr.s_addr = *(LPDWORD)bAddr;

iStatus = connect(s, (LPSOCKADDR)&sin, sizeof(SOCKADDR_IN));

 

6. Якщо з'єднання з хостом неможливе, то виділення пам’яті для нової змінної

// if(iStatus!= SOCKET_ERROR)

{

hMem = GlobalAlloc(GHND, 32780);

szBuffer = GlobalLock(hMem);

  1. Передання інформації серверу

// iStatus = send(s, szName, lstrlen(szName), 0);

send(s, "\r\n", 2, 0);

  1. Доки не відключимося, отримуємо дані

// while(1)

{

iStatus = recv(s, szBuffer + lstrlen(szBuffer),

32767 - lstrlen(szBuffer), 0);

7.1 Якщо відключилися, вихід із циклу

// if(iStatus == 0)

break;

}

8. Закриття сокету

//closesocket(s);

 

 

Отримання списку сервера

  1. Відкриття сонета

// s = socket(PF_INET, SOCK_STREAM, 0);

EnableWindow(GetDlgItem(hDlg, IDOK), FALSE);

EnableWindow(GetDlgItem(hDlg, 103), FALSE);

 

2. Якщо сокет відкрито, заповнення даних з’єднання

// if(s!= INVALID_SOCKET)

{

bAddr = *phe->h_addr_list;

sin.sin_family = AF_INET;

sin.sin_port = htons(IPPORT_WHOIS);

sin.sin_addr.s_addr = *(LPDWORD)bAddr;

iStatus = connect(s, (LPSOCKADDR)&sin, sizeof(SOCKADDR_IN));

 

3. Якщо з'єднання з хостом неможливе, відіслати список серверів whois

if(iStatus!= SOCKET_ERROR)

{

hMem = GlobalAlloc(GHND, 32780);

szBuffer = GlobalLock(hMem);

 

send(s, "whois-servers\r\n", 15, 0);

 

4. Доки з’єднання є, отримувати дані із сервера

// while(1)

{

iStatus = recv(s, szBuffer + lstrlen(szBuffer),

32767 - lstrlen(szBuffer), 0);

 

5. Якщо передача закінчилась, видключаємось

if(iStatus == 0)

break;

 

6. Закриття сонету

closesocket(s);

 

Алгоритм роботи сервера

 

  1. Включення серверу

IdTCPServer1.Active:=true;

 

  1. Очікування прийому повідомлень

ListBox1.Items.Add(AThread.Connection.ReadLn());

 

  1. Відправлення повідомлення про готовність сервера

AThread.Connection.WriteLn('Server OK');

 

4. Відключення від серверу.

AThread.Connection.Disconnect;

 

Текст програми клієнта:

DWORD WhoisUser(HWND hDlg)

{

struct hostent *phe;

char szHost[ 256 ], szName[ 256 ], *pszBase, *pszNext;

SOCKET s;

SOCKADDR_IN sin;

int iStatus;

BYTE *bAddr;

HANDLE hMem;

char *szBuffer;

 

 

if(! SendDlgItemMessage(hDlg, 100, WM_GETTEXT, 256, (LPARAM)szName)) //якщо поле домену не заповнене

{

MessageBox(hDlg, "Nothing specified in Name field!", "WinWho",

MB_OK | MB_ICONEXCLAMATION); // Вивід повідомлення про помилку

return(FALSE);

}

 

if(! SendDlgItemMessage(hDlg, 102, WM_GETTEXT, 256, (LPARAM)szHost)) //якщо сервер Whois не встановлено

{

MessageBox(hDlg, "No WhoIs Server Specified (try Change)", "WinWho",

MB_OK | MB_ICONEXCLAMATION); // Вивід повідомлення про помилку

return(FALSE);

}

 

EnableWindow(GetDlgItem(hDlg, IDOK), FALSE);

EnableWindow(GetDlgItem(hDlg, 103), FALSE);

phe = gethostbyname(szHost);

if(! phe) //Якщо не вдається з'єднатися із сервером

{

MessageBox(hDlg, "Unable to locate specified Server!", "WinWho",

MB_OK | MB_ICONEXCLAMATION); // Вивід повідомлення про помилку

EnableWindow(GetDlgItem(hDlg, IDOK), TRUE);

EnableWindow(GetDlgItem(hDlg, 103), TRUE);

return(FALSE);

}

 

s = socket(PF_INET, SOCK_STREAM, 0);

if(s!= INVALID_SOCKET) // якщо сокет вірний

{

bAddr = *phe->h_addr_list; // Заповнення даних з'єднання для сервера

sin.sin_family = AF_INET;

sin.sin_port = htons(IPPORT_WHOIS);

sin.sin_addr.s_addr = *(LPDWORD)bAddr;

iStatus = connect(s, (LPSOCKADDR)&sin, sizeof(SOCKADDR_IN));

 

if(iStatus!= SOCKET_ERROR) // Якщо з'єднання з хостом неможливе

{

hMem = GlobalAlloc(GHND, 32780);

szBuffer = GlobalLock(hMem); //виділення пам'яті

 

iStatus = send(s, szName, lstrlen(szName), 0);

send(s, "\r\n", 2, 0); //передання інформації серверу

 

while(1) //доки не відключимося

{

iStatus = recv(s, szBuffer + lstrlen(szBuffer), // отримання даних

32767 - lstrlen(szBuffer), 0);

if(iStatus == 0) // якщо відключились, вихід

break;

}

 

iStatus = lstrlen(szBuffer);

if(iStatus)

{

SendDlgItemMessage(hDlg, 101, LB_RESETCONTENT, 0, 0);

pszBase = szBuffer;

while(1)

{

pszNext = strchr(pszBase, '\r');

if(! pszNext)

pszNext = strchr(pszBase, '\n');

 

if(pszNext)

{

*pszNext = '\0';

++pszNext;

if(*pszNext == '\n')

++pszNext;

}

 

SendDlgItemMessage(hDlg, 101, LB_ADDSTRING, 0, (LPARAM)pszBase);

if(pszNext)

pszBase = pszNext;

else

break;

}

}

GlobalUnlock(hMem); // Звільнення пам'яті

GlobalFree(hMem);

}

closesocket(s); //закриття сокету

}

EnableWindow(GetDlgItem(hDlg, IDOK), TRUE);

EnableWindow(GetDlgItem(hDlg, 103), TRUE);

return(TRUE);

}

 

//

 

DWORD GetServerList(HWND hDlg)

{

struct hostent *phe;

char *pszBase, *pszNext;

SOCKET s;

SOCKADDR_IN sin;

int iStatus;

BYTE *bAddr;

HANDLE hMem;

char *szBuffer;

 

 

phe = gethostbyname("sipb.mit.edu");

if(! phe)

return(FALSE);

// Відкрити сокет або знищітись якщо неможливо

s = socket(PF_INET, SOCK_STREAM, 0);

EnableWindow(GetDlgItem(hDlg, IDOK), FALSE);

EnableWindow(GetDlgItem(hDlg, 103), FALSE);

if(s!= INVALID_SOCKET)

{

bAddr = *phe->h_addr_list; // Заповнення даних з'єднання

sin.sin_family = AF_INET;

sin.sin_port = htons(IPPORT_WHOIS);

sin.sin_addr.s_addr = *(LPDWORD)bAddr;

iStatus = connect(s, (LPSOCKADDR)&sin, sizeof(SOCKADDR_IN));

 

if(iStatus!= SOCKET_ERROR) // Якщо з'єднання з хостом неможливе

{

hMem = GlobalAlloc(GHND, 32780);

szBuffer = GlobalLock(hMem);

 

send(s, "whois-servers\r\n", 15, 0);

 

while(1)

{

iStatus = recv(s, szBuffer + lstrlen(szBuffer),

32767 - lstrlen(szBuffer), 0);

if(iStatus == 0)

break;

}

 

iStatus = lstrlen(szBuffer);

if(iStatus)

{

SendDlgItemMessage(hDlg, 101, LB_RESETCONTENT, 0, 0);

pszBase = szBuffer;

while(1)

{

pszNext = strchr(pszBase, '\r');

if(! pszNext)

pszNext = strchr(pszBase, '\n');

 

if(pszNext)

{

*pszNext = '\0';

++pszNext;

if(*pszNext == '\n')

++pszNext;

}

 

SendDlgItemMessage(hDlg, 101, LB_ADDSTRING, 0, (LPARAM)pszBase);

if(pszNext)

pszBase = pszNext;

else

break;

}

}

GlobalUnlock(hMem);

GlobalFree(hMem);

}

closesocket(s);

}

EnableWindow(GetDlgItem(hDlg, IDOK), TRUE);

EnableWindow(GetDlgItem(hDlg, 103), TRUE);

return(TRUE);

}

 

Екранні результати роботи програми:

Рис.1 Ведення доменного імені, яке нас цікавить


Рис.2 Виведення інформації про домен


1 | 2 | 3 |

Поиск по сайту:



Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.02 сек.)