Сервер с отменой блокирующих запросов ввода-вывода — КиберПедия 

Типы оградительных сооружений в морском порту: По расположению оградительных сооружений в плане различают волноломы, обе оконечности...

Биохимия спиртового брожения: Основу технологии получения пива составляет спиртовое брожение, - при котором сахар превращается...

Сервер с отменой блокирующих запросов ввода-вывода

2019-09-17 135
Сервер с отменой блокирующих запросов ввода-вывода 0.00 из 5.00 0 оценок
Заказать работу

    В потребительских версиях ОС 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 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.008 с.