Типы оградительных сооружений в морском порту: По расположению оградительных сооружений в плане различают волноломы, обе оконечности...
Биохимия спиртового брожения: Основу технологии получения пива составляет спиртовое брожение, - при котором сахар превращается...
Топ:
Оценка эффективности инструментов коммуникационной политики: Внешние коммуникации - обмен информацией между организацией и её внешней средой...
Проблема типологии научных революций: Глобальные научные революции и типы научной рациональности...
Генеалогическое древо Султанов Османской империи: Османские правители, вначале, будучи еще бейлербеями Анатолии, женились на дочерях византийских императоров...
Интересное:
Наиболее распространенные виды рака: Раковая опухоль — это самостоятельное новообразование, которое может возникнуть и от повышенного давления...
Аура как энергетическое поле: многослойную ауру человека можно представить себе подобным...
Как мы говорим и как мы слушаем: общение можно сравнить с огромным зонтиком, под которым скрыто все...
Дисциплины:
2019-09-17 | 135 |
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-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!