Наброски и зарисовки растений, плодов, цветов: Освоить конструктивное построение структуры дерева через зарисовки отдельных деревьев, группы деревьев...
Историки об Елизавете Петровне: Елизавета попала между двумя встречными культурными течениями, воспитывалась среди новых европейских веяний и преданий...
Топ:
История развития методов оптимизации: теорема Куна-Таккера, метод Лагранжа, роль выпуклости в оптимизации...
Организация стока поверхностных вод: Наибольшее количество влаги на земном шаре испаряется с поверхности морей и океанов...
Установка замедленного коксования: Чем выше температура и ниже давление, тем место разрыва углеродной цепи всё больше смещается к её концу и значительно возрастает...
Интересное:
Мероприятия для защиты от морозного пучения грунтов: Инженерная защита от морозного (криогенного) пучения грунтов необходима для легких малоэтажных зданий и других сооружений...
Принципы управления денежными потоками: одним из методов контроля за состоянием денежной наличности является...
Как мы говорим и как мы слушаем: общение можно сравнить с огромным зонтиком, под которым скрыто все...
Дисциплины:
|
из
5.00
|
Заказать работу |
Содержание книги
Поиск на нашем сайте
|
|
|
|
В потребительских версиях ОС Windows существует проблема неспособности отмены блокирующих запросов ввода-вывода. Серверы почтовых ящиков для получения данных вызывают функцию ReadFile. Если сервер создается с флагом MAILSLOT_WAIT_FOREVER, запросы блокируются на неопределенное время, пока данные не станут доступными. При невыполненном запросе функции ReadFile серверное приложение при завершении зависает. Единственный способ снять приложение – перезагрузить систему. Для решения этой проблемы можно заставить сервер открыть описатель его почтового ящика в отдельном потоке и отправить данные, чтобы прервать блокирующий запрос чтения. В приложении представлена программа сервера с отменой блокирующих запросов. В представленной программе в отдельном потоке выполняется функция ServeMailslot – рабочая функция сервера почтового ящика для обработки всего входящего ввода-вывода ящика, а функция SendMessagrToMailslot в основном потоке отправляет сообщение ящику, чтобы прервать вызов функции ReadFile.
Приложение 1
Листинг программы – простой сервер почтового ящика
#include "stdafx.h"
#include <windows.h>
#include <conio.h>
#include <iostream.h>
#include <stdio.h>
#include <string.h>
int main(int argc, char* argv[])
{
HANDLE Mailslot;
char path[255];
char buffer[255];
DWORD NumberOfBytes;
cin>>path;
if ((Mailslot=CreateMailslot(path,0,MAILSLOT_WAIT_FOREVER,NULL))
==INVALID_HANDLE_VALUE)
{
printf("Unable to create mailslot!\n");
GetLastError();
return 0;
}
printf("Sozdan server s imenem %s!",path);
getch();
while(ReadFile(Mailslot,buffer,255,&NumberOfBytes,NULL)!=0)
{
printf("Prinyato:\n");
buffer[NumberOfBytes]=0;
printf("%s\n",buffer);
}
return 0;
}
Листинг программы – простой клиент почтового ящика
#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
#include <conio.h>/*
#define ServerName "\\\\.\\mailslot\\myslot" */
void main(void)
{
HANDLE Mailslot;
DWORD BytesWritten;
char chf[256];
char chfb[256];
char chfi[256];
//nst char* cs1 = "exit";const char* cs1 = "exit";
const char* cs = "server\\mailslot\\name";
puts(" puts resurs");
// puts(cs1);
puts(cs);
printf("cmd>");
gets(chf);
sprintf(chfi,"\\\\%s",chf);
// CHAR ServerName[256];
//int c = 1;
{
printf("Usage: client <server name>\n");
return;
}
sprintf(ServerName, "\\\\%s\\mailslot\\myslot", argv[1]);*/
if ((Mailslot = CreateFile(chfi, GENERIC_WRITE,
FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,
NULL)) == INVALID_HANDLE_VALUE)
{
printf("CreateFile failed with error %d\n", GetLastError());
printf("exit\n");
_getch();
return;
}
puts("puts data ");
printf("cmd> ");
gets(chfb);
if (WriteFile(Mailslot, chfb,strlen(chfb)+1,
&BytesWritten, NULL) == 0)
/*if (WriteFile(Mailslot, "This is a test", 14, &BytesWritten,
NULL) == 0)*/
{
printf("WriteFile failed with error %d\n", GetLastError());
printf("exit\n");
_getch();
return;
}
printf("Wrote %d bytes\n", BytesWritten);
printf("exit\n");
_getch();
CloseHandle(Mailslot);
}
Листинг программы - сервер с отменой блокирующих запросов ввода-вывода
#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
#include <conio.h>
BOOL StopProcessing;
int adf =1;
DWORD WINAPI ServeMailslot(LPVOID lpParameter);
void SendMessageToMailslot(void);
void main(void) {
DWORD ThreadId;
HANDLE MailslotThread;
int adf =1;
StopProcessing = FALSE;
MailslotThread = CreateThread(NULL, 0, ServeMailslot, NULL,
0, &ThreadId);
printf("Press a key to stop the server Myslot\n");
_getch();
StopProcessing = TRUE;
SendMessageToMailslot();
if (WaitForSingleObject(MailslotThread, INFINITE) == WAIT_FAILED)
{
printf("WaitForSingleObject failed with error %d\n",
GetLastError());
return;
}
}
DWORD WINAPI ServeMailslot(LPVOID lpParameter)
{
char buffer[2048];
DWORD NumberOfBytesRead;
DWORD Ret;
HANDLE Mailslot;
if ((Mailslot = CreateMailslot("\\\\.\\Mailslot\\Myslot", 2048,
MAILSLOT_WAIT_FOREVER, NULL)) == INVALID_HANDLE_VALUE)
{
printf("Failed to create a MailSlot %d\n", GetLastError());
return 0;
}
while((Ret = ReadFile(Mailslot, buffer, 2048,
&NumberOfBytesRead, NULL))!= 0)
{
printf("Received %d bytes\n", NumberOfBytesRead);
buffer[NumberOfBytesRead]=0;
printf("%s\n",buffer);
if (StopProcessing)
}
CloseHandle(Mailslot);
return 0;
}
void SendMessageToMailslot(void)
{
HANDLE Mailslot;
DWORD BytesWritten;
if ((Mailslot = CreateFile("\\\\.\\Mailslot\\Myslot",
GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, NULL)) == INVALID_HANDLE_VALUE)
{
printf("CreateFile failed with error %d\n", GetLastError());
return;
}
if (WriteFile(Mailslot, "STOP", 4, &BytesWritten, NULL) == 0)
{
printf("WriteFile failed with error %d\n", GetLastError());
return;
}
CloseHandle(Mailslot);
}
|
|
|
Особенности сооружения опор в сложных условиях: Сооружение ВЛ в районах с суровыми климатическими и тяжелыми геологическими условиями...
Опора деревянной одностоечной и способы укрепление угловых опор: Опоры ВЛ - конструкции, предназначенные для поддерживания проводов на необходимой высоте над землей, водой...
Эмиссия газов от очистных сооружений канализации: В последние годы внимание мирового сообщества сосредоточено на экологических проблемах...
Состав сооружений: решетки и песколовки: Решетки – это первое устройство в схеме очистных сооружений. Они представляют...
© cyberpedia.su 2017-2026 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!