ИНТЕРФЕЙС ЗА WINDOWS SOCKETS - Studiopedia
Сокети, дейтаграми и комуникационни канали
В локалните и глобалните мрежи има два принципно различни начина за предаване на данни.
Първият от тях включва изпращане на пакети данни от един възел до друг (или няколко възела наведнъж) без получаване на потвърждение за доставка и дори без гаранция, че предадените пакети ще бъдат получени в правилната последователност. Пример за такъв протокол е UDP протоколът (User Datagram Protocol), който се използва в TCP/IP мрежи, или IPX протоколът, който е основен в мрежите Novell NetWare.
Основните предимства на протоколите за дейтаграми са висока скорост и възможност за излъчване на данни, когато един възел изпраща съобщения, а други ги получават, всички по едно и също време.
Вторият метод за предаване на данни включва създаването на канал за предаване на данни между два различни мрежови възела. В този случай каналът се създава с помощта на дейтаграмни протоколи, но доставката на пакети в канала е гарантирана. Пакетите винаги пристигат непокътнати и в правилния ред, въпреки че производителността е средно по-ниска поради изпращане на потвърждения. Примери за протоколи, които използват комуникационни канали, са TCP и SPX протоколи (протоколът NETBIOS позволява пренос на данни, използвайки както дейтаграми, така и комуникационни канали).
За да прехвърлите данни, използвайки някой от горните методи, всяко приложение трябва да създаде обект, наречен сокет.
По своето предназначение сокетът е най-близък до манипулатора на файла (хендрала на файла), който е необходим за извършване на операции за четене или запис на файла. Преди приложение, работещо на хост, да може да предава или получаваданни, той трябва да създаде сокет и да го инициализира с някои параметри.
Що се отнася до последния параметър (тип гнездо), има два вида гнезда. Първият тип е предназначен за предаване на данни под формата на дейтаграми, а вторият - чрез комуникационни канали.
Инициализация и изключване на приложението
По време на процеса на инициализация приложението трябва да се регистрира в библиотеката WSOCK32.DLL, която предоставя на приложенията интерфейс Windows Sockets на операционните системи Microsoft Windows 95 и Microsoft Windows NT.
За инициализация трябва да извикате функцията WSAStartup, дефинирана по следния начин:
int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData);
В параметъра wVersionRequested трябва да посочите версията на интерфейса на Windows Sockets, необходима за работата на вашето приложение. Старшият байт на параметъра показва номера на второстепенната версия (малка версия), малкият байт показва номера на основната версия (основна версия).
Преди да извика функцията WSAStartup, параметърът lpWSAData трябва да съдържа указател към структура от тип WSADATA, която ще съхранява информация за конкретно изпълнение на интерфейса на Windows Sockets.
Ако е успешна, функцията WSAStartup връща нула. Ако възникне грешка, се връща една от следните стойности:
Значение | Описание |
WSASYNOTREADY | Мрежовият софтуер не е готов за работа |
WSAVERНЕ СЕ ПОДДЪРЖА | Функцията не се поддържа от тази реализация на интерфейса на Windows Sockets |
WSAEINVAL | DLL, предоставящ интерфейса на Windows Sockets, не съответства на версията, посочена от приложението, посочено в параметъра wVersionRequested |
Под ниепредстави фрагмент от изходния код на приложението SERVER, което ще бъде описано по-долу, извършвайки инициализацията на интерфейса на Windows Sockets:
rc = WSAStartup (MAKEWORD(1, 1), &WSAData);
MessageBox(NULL, "WSAStartup Error", "Error", MB_OK);
// Показване на описанието и версията на системата Windows Sockets
// в контролния прозорец на лентата на състоянието
wsprintf(szTemp, "Сървърът използва %s %s",
hwndSb = CreateStatusWindow(WS_CHILD WS_VISIBLE
WS_BORDER SBARS_SIZEGRIP, szTemp, hWnd, IDS_STATUSBAR);
Microsoft Windows 95 и Microsoft Windows NT версия 3.51 имат вградени Windows Sockets версия 1.1, поради което посочихме тази стойност при извикване на функцията WSAStartup.
В следващите няколко реда на току-що показания кодов фрагмент съдържанието на двете полета на структурата на типа WSADATA се показва в контролния прозорец на лентата на състоянието.
Дефиницията на WSADATA структура и указател към нея изглежда така:
typedef структура WSAData
неподписани кратки iMaxSockets;
неподписан кратък iMaxUdpDg;
char FAR *lpVendorInfo;
typedef WSADATA FAR *LPWSADATA;
Използваните по-горе полета szDescription и szSystemStatus след извикване на функцията WSAStartup съдържат съответно описание на конкретна реализация на интерфейса на Windows Socket и текущото състояние на този интерфейс под формата на текстови низове.
Полетата wVersion и wHighVersion съдържат съответно версията на спецификацията на Windows Socket, която приложението ще използва, и версията на спецификацията, на която съответства конкретното изпълнение на интерфейса на Windows Socket.
Едно приложение може да създаде множество сокети едновременно, например за използване в различни подзадачи на един и същи процес. В полето iMaxSocketsсъхранява максималния брой сокети, които могат да бъдат получени за един процес.
Полето iMaxUdpDg съдържа максималния размер на пакет от данни, който може да бъде изпратен с помощта на UDP протокола за дейтаграма.
И накрая, полето lpVendorInfo съдържа указател към допълнителна информация, чийто формат зависи от производителя на конкретна реализация на системата Windows Sockets.
Преди да завърши работата си, приложението трябва да освободи ресурсите, получени от операционната система, за да работи с Windows Sockets. За да изпълни тази задача, приложението трябва да извика функцията WSACleanup, дефинирана, както е показано по-долу:
int WSACleanup(void);
Тази функция може да върне null при успех или SOCKET_ERROR при грешка.
За да получите кода за грешка, трябва да използвате функция с име WSAGetLastError:
int WSAGetLastError(void);
Функцията WSAGetLastError ви позволява да определите кода на грешката, когато почти всички функции на интерфейса на Windows Sockets се провалят. Трябва да го извикате веднага след неуспешната функция.
Ако възникне грешка при изпълнение на функцията WSACleanup, функцията WSAGetLastError може да върне една от следните стойности:
Значение | Описание |
WSAN НЕ ИНИЦИАЛИЗИРАН | Интерфейсът на Windows Sockets не е инициализиран с функцията WSAStartup |
WSAENETDOWN | Грешка в мрежовия софтуер |
WSAEINPROGRESS | Една от блокиращите функции на интерфейса на Windows Sockets се изпълняваше по време на повикване към WSACleanup |
Нека направим малко пояснение относно последната грешка в този списък, която има код WSAEINPROGRESS.
Някои функции на интерфейса на Windows Sockets могат да блокират приложение, тъй като не се връщат, докато не завършат. При превантивни многозадачни операционни системи, като Microsoft Windows 95 и Microsoft Windows NT, това не заключва цялата система. Както ще видите по-късно, блокиращите функции могат да бъдат избегнати, защото има заместител за тях в интерфейса на Windows Sockets.
Не намерихте това, което търсихте? Използвайте търсачката:
Деактивирайте adBlock! и опреснете страницата (F5)наистина е необходимо