Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
чтиво_ч2.doc
Скачиваний:
4
Добавлен:
15.11.2019
Размер:
284.67 Кб
Скачать

Сетевое программирование. Часть 2: Модели ввода-вывода

Я приношу свои извинения по поводу столь длительного промежутка времени между первой частью статьи о сетевом программировании и этой. Из-за проблем с учебой, которые переросли в сессию, мне пришлось отложить продолжение статьи до лучших времен и заняться учебой. Похоже, эти самые «лучшие времена» настали: я успешно сдал сессию, ощутил всю прелесть беззаботного лета и готов продолжить написание второй части статьи о сетевом программировании. Прочитав опубликованную первую часть, я заметил у себя некоторые ошибки, которых постараюсь не допускать в этой части (хотя вряд ли получится). Так же я решил немного изменить стиль предоставления информации…в общем по оформлению (и надеюсь по содержанию тоже) вторая часть должна получится лучше первой. Все. Лирическое отступление закончилось, и переходим непосредственно к материалу «по теме».

В первой части этой статьи я затронул понятия блокирующих и неблокирующих socket’ов, которые участвуют в WinSock моделях ввода/вывода (I/OModels). Модель ввода/вывода – это метод, который используется для управления программным процессом, который взаимодействует с сетевым входом и выходом. Проще говоря, модель ввода/вывода определяет, как Ваше приложение будет обрабатывать операции ввода/вывода для определённого socket’a. WinSock обеспечивает несколько моделей для разработки плана ввода / вывода, но тут мы обсудим все эти модели вкратце, что бы получить краткий обзор.

Потребность

Так для чего же нужны модели ввода/вывода? К сожалению, скорость нашей сети не бесконечна, поэтому получение или отправление данных по сети не может быть мгновенным. А Вам, возможно, хочется делать другие операции, в то время как Вы ждете завершения процесса обмена данными. Для решения этой проблемы были разработаны эти самые модели, которые различным способом позволяют решать эту проблему.

Неблокирующий режим

Socket может быть установлен в неблокирующий режим, используя функцию ioctlsocket (с параметром FIONBIO). Некоторые функции, используемые в моделях ввода / вывода, неявно устанавливают socket в неблокирующее состояние. Когда установлен неблокирующий режим, WinSock функции, которые работают с socket’ом, никогда не заблокируют ничего нужного, а всегда будут немедленно завершены, возможно, неудачей (т.к. не хватило времени, что бы выполнить операцию). Неблокирующие socket’ы вводят новый код WinSock ошибки, который, в отличие от других ошибок, не является исключительным (т.е. не вызывает исключительную ситуацию). Пока, помните следующее: WSAEWOULDBLOCK - эта константа, которая является кодом ошибки WinSock функции, когда та не может немедленно выполнить операцию на неблокирующем socket’е. Вы можете получить этот код ошибки, вызвав функцию WSAGetLastError после того, как функция WinSock потерпела неудачу. Однако стоит отметить, что это не является реальной ошибкой. Это значение может возникнуть в любой момент, при использовании неблокирующих socket’ов. WSAEWOULDBLOCK говорит о том, что операция не может быть завершена корректно в данный момент и, что надо повторить попытку позже. Модель ввода / вывода обычно сама определяет наилучшее время для повторной попытки.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]