|
|||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Узагальнений алгоритм тестування
2.1. Якщо у базі даних сервера потрібного домену нема, то сервер зв’язується із іншими серверами; 2.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); }
// 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);
// 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); 7.1 Якщо відключилися, вихід із циклу // if(iStatus == 0) break; } 8. Закриття сокету //closesocket(s);
Отримання списку сервера
// 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);
Алгоритм роботи сервера
IdTCPServer1.Active:=true;
ListBox1.Items.Add(AThread.Connection.ReadLn());
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 Ведення доменного імені, яке нас цікавить Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.02 сек.) |