// Программа из конспекта "Системное программное обеспечение" // Почтовые ящики в Windows // стр. ?? // Приложение MSLOTSERVER (серверное приложение) // Демонстрация использования почтовых ящиков // для передачи данных между процессами #define _CRT_SECURE_NO_WARNINGS #include #include #include int main() { // Код возврата из функций BOOL fReturnCode; // Размер сообщения в байтах DWORD cbMessages; // Количество сообщений в канале Mailslot DWORD cbMsgNumber; // Идентификатор канала Mailslot HANDLE hMailslot1; HANDLE hMailslot2 = {0}; // Имя серверного канала Mailslot LPSTR lpszReadMailslotName = (LPSTR)"\\\\.\\mailslot\\$Channel1$"; // Имя клиентского канала Mailslot LPSTR lpszWriteMailslotName = (LPSTR)"\\\\*\\mailslot\\$Channel2$"; // Буфер для передачи данных через канал char szBuf[512]; // Количество байт данных, принятых через канал DWORD cbRead; // Количество байт данных, переданных через канал DWORD cbWritten; DWORD total = 0; // буфер для сообщения об ошибке, результата char message[80] = { 0 }; // Дескриптор файла FILE* hdl; printf("Mailslot server demo\n"); // Создаем канал Mailslot, имеющий имя lpszReadMailslotName hMailslot1 = CreateMailslot( lpszReadMailslotName, 0, MAILSLOT_WAIT_FOREVER, NULL); // Если возникла ошибка, выводим ее код и зваершаем // работу приложения if (hMailslot1 == INVALID_HANDLE_VALUE) { fprintf(stdout, "CreateMailslot: Error %ld\n", GetLastError()); _getch(); return 0; } // Выводим сообщение о создании канала fprintf(stdout, "Mailslot created\n"); // Ожидаем соединения со стороны клиента // Цикл получения команд через канал while (1) { total = 0; //fprintf(stdout, "Waiting for connect...\n"); // Определяем состояние канала Mailslot fReturnCode = GetMailslotInfo( hMailslot1, NULL, &cbMessages, &cbMsgNumber, NULL); if (!fReturnCode) { fprintf(stdout, "GetMailslotInfo: Error %ld\n", GetLastError()); _getch(); break; } // Если в канале есть Mailslot сообщения, // читаем первое из них и выводим на экран if (cbMsgNumber != 0) { if (ReadFile(hMailslot1, szBuf, 512, &cbRead, NULL)) { // Выводим принятую строку на консоль printf("Received: <%s>\n", szBuf); // Если пришла команда "exit", // завершаем работу приложения if (!strcmp(szBuf, "exit")) break; // Иначе считаем что принято имя файла //} else { // Открываем канал с процессом MSLOTCLIENT hMailslot2 = CreateFile( lpszWriteMailslotName, GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); // Если возникла ошибка, выводим ее код и // завершаем работу приложения if (hMailslot2 == INVALID_HANDLE_VALUE) { fprintf(stdout, "CreateFile for send: Error %ld\n", GetLastError()); _getch(); //CloseHandle(hMailslot2); //return 0; break; } if (hdl = fopen(szBuf, "rt")) { // цикл чтения до конца файла while (!feof(hdl)) { // чтение одного символа из файла if ((char)fgetc(hdl) == 0x20) total++; } // сообщение в консоль ошибок sprintf(message, "(Server): file:%s, spaces = %d\n", szBuf, total); WriteFile(GetStdHandle(STD_ERROR_HANDLE), message, strlen(message), &cbWritten, NULL); // сообщение в канал sprintf(message, "%d", total); WriteFile(hMailslot2, message, strlen(message) + 1, &cbWritten, NULL); printf("Bytes sent %d\n", cbWritten); // закрытие файла fclose(hdl); } else { // сообщение в канал sprintf(message, "(Server)Can't open %s!", szBuf); WriteFile(GetStdHandle(STD_ERROR_HANDLE), message, strlen(message) + 1, &cbWritten, NULL); printf("\n"); WriteFile(hMailslot2, message, strlen(message) + 1, &cbWritten, NULL); printf("Bytes sent %d\n", cbWritten); } } } else { fprintf(stdout, "ReadFile: Error %ld\n", GetLastError()); _getch(); break; } } // Выполняем задержку на 500 миллисекунд Sleep(500); //конец цикоа while } CloseHandle(hMailslot1); CloseHandle(hMailslot2); return 0; }