Состав сооружений: решетки и песколовки: Решетки – это первое устройство в схеме очистных сооружений. Они представляют...
История развития пистолетов-пулеметов: Предпосылкой для возникновения пистолетов-пулеметов послужила давняя тенденция тяготения винтовок...
Топ:
Организация стока поверхностных вод: Наибольшее количество влаги на земном шаре испаряется с поверхности морей и океанов...
Эволюция кровеносной системы позвоночных животных: Биологическая эволюция – необратимый процесс исторического развития живой природы...
Марксистская теория происхождения государства: По мнению Маркса и Энгельса, в основе развития общества, происходящих в нем изменений лежит...
Интересное:
Берегоукрепление оползневых склонов: На прибрежных склонах основной причиной развития оползневых процессов является подмыв водами рек естественных склонов...
Что нужно делать при лейкемии: Прежде всего, необходимо выяснить, не страдаете ли вы каким-либо душевным недугом...
Инженерная защита территорий, зданий и сооружений от опасных геологических процессов: Изучение оползневых явлений, оценка устойчивости склонов и проектирование противооползневых сооружений — актуальнейшие задачи, стоящие перед отечественными...
Дисциплины:
2019-09-17 | 139 |
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);
}
|
|
Механическое удерживание земляных масс: Механическое удерживание земляных масс на склоне обеспечивают контрфорсными сооружениями различных конструкций...
Организация стока поверхностных вод: Наибольшее количество влаги на земном шаре испаряется с поверхности морей и океанов (88‰)...
Типы сооружений для обработки осадков: Септиками называются сооружения, в которых одновременно происходят осветление сточной жидкости...
Индивидуальные очистные сооружения: К классу индивидуальных очистных сооружений относят сооружения, пропускная способность которых...
© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!