Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.12.2012, 00:34   #1
lowercase
Пользователь
 
Регистрация: 15.05.2010
Сообщений: 88
По умолчанию Чтение и запись в канал mailslot

Здраствуйте. Пробую сделать передачу данных между процессами с помощью mailslot. Запись получается, а чтение не получается
вот так выглядит сервер:
Код:
#include <stdlib.h>
#include <stdio.h>
#include <windows.h>
#include <windef.h>
#include <process.h>


#define KILOBYTE 1024
#define BUFFER_SIZE (25 * KILOBYTE)

char mailSlotName[] = "\\\\.\\mailslot\\sslab";

int main() {
    HANDLE hMailslot = CreateMailslot(mailSlotName, BUFFER_SIZE, MAILSLOT_WAIT_FOREVER, NULL);
    if(hMailslot != INVALID_HANDLE_VALUE){
        printf("Mailslot created...\n");
        system("pause");
    }
    CloseHandle(hMailslot);
    return (EXIT_SUCCESS);
}

а вот так выглядит клиент:
Код:
#include <stdio.h>
#include <stdlib.h>
#include <windef.h>
#include <windows.h>

#define MENU_READ 1
#define MENU_WRITE 2
#define MENU_EXIT 0

#define KILOBYTE 1024
#define BUFFER_SIZE (25 * KILOBYTE)

int showMenu();

int main(int argc, char** argv) {

    char mailslotName[] = "\\\\.\\mailslot\\sslab";
    HANDLE hMailslot = CreateFile(mailslotName, GENERIC_READ | GENERIC_WRITE,
                FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
	
    if(hMailslot == INVALID_HANDLE_VALUE){
        printf("Error: can't open mailslot channel...\n");
        return (EXIT_FAILURE);
    }

    int m;
    char* buf = (char*)calloc(BUFFER_SIZE, sizeof(char));
    
    while ((m = showMenu()) != MENU_EXIT) {
        switch (m) {
            case MENU_READ:{
                DWORD read;
                if(ReadFile(hMailslot, buf, BUFFER_SIZE, &read, NULL)){
                    printf("mailslot buffer data:\n");
                    printf("%s\n", buf);
                } else {
                    pause("Error: can't read data from mailslot");
                }
                break;
            }
            case MENU_WRITE:{
                DWORD write;
                fgets(buf, BUFFER_SIZE - 1, stdin);
                if(WriteFile(hMailslot, buf, strlen(buf), &write, NULL)){
                    printf("string writen to mailslot\n");
                } else {
                    pause("Error: can't write data to mailslot");
                }
                break;
            }
        }
    }
    free(buf);
    return (EXIT_SUCCESS);
}

int showMenu() {
    printf("1. - Read data from buffer\n");
    printf("2. - Write data to buffer\n");
    printf("0. - Exit\n");
    int c = getchar() - '0';
    fscanf(stdin, "%*c");
    return c;
}

int pause(const char* message){
    printf("%s.", message);
    system("Pause");
}
когда делаю запись то все нормально и выводится сообщение "string writen to mailslot". когда же пытаюсь прочитать то что несколько секунд назад записал так тут сразу же ReadFile возвращает 0 и соответсвенно выводится "Error: can't read data from mailslot".
Подскажите пожалуйста как правильно сделать чтение?

Последний раз редактировалось lowercase; 15.12.2012 в 12:41.
lowercase вне форума Ответить с цитированием
Старый 15.12.2012, 12:15   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

ПОсле записи воспользуйтесь GetMailSlotInfo() чтоб проверить.
Я впервые вижу такой способ использования - читать и писать через один манипулятор. Откройте два - один, через CreateMailSLot() (сервер) а другой через CreateFile(). Соответственно потом через один манипулятор будете читать что записано в другой и наоборот.
waleri вне форума Ответить с цитированием
Старый 15.12.2012, 12:51   #3
lowercase
Пользователь
 
Регистрация: 15.05.2010
Сообщений: 88
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Откройте два - один, через CreateMailSLot() (сервер) а другой через CreateFile().
не совсем понял. у меня же вродебы так и есть - сервер открывает через CreateMailSlot, клиент открывает через CreateFile.

мне нужно лишь чтобы клиент мог производить как запись так и чтение. везде где я гуглил чтение делает только сервер, а клиент лишь посылает сообщения.

p.s.:
я с winapi знаком на уровне "вот это машина. если завести двигатель, включить передачу и нажать педаль газа, то она поедит". а про почтовые слоты вообще знаю только третий день.

Последний раз редактировалось lowercase; 15.12.2012 в 12:53.
lowercase вне форума Ответить с цитированием
Старый 15.12.2012, 13:21   #4
lowercase
Пользователь
 
Регистрация: 15.05.2010
Сообщений: 88
По умолчанию

а клиент вообще може делать чтение из mailslot? или он только посылает сообщения серверу?
lowercase вне форума Ответить с цитированием
Старый 15.12.2012, 14:09   #5
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

http://www.codeproject.com/Articles/...-Communication

Лучше скажите, что вам надо, может есть и другие способы... Судя по всему named pipes вам подойдут лучше - там связь двусторонняя
waleri вне форума Ответить с цитированием
Старый 15.12.2012, 18:30   #6
lowercase
Пользователь
 
Регистрация: 15.05.2010
Сообщений: 88
По умолчанию

да тут, понимаете, в чем дело. это лабораторная по спо. нужно организировать взаимодействе между процесами, используя критические секции/семафоры/мютексы/события.
процесы должны делать чтение и запись в единый для всех буфер(таким образом взаимодействовать друг с другом). способы синхронизаци и буфер опредиляются по варианту. у когото попадется named pipes у когото clipboard. у меня попался mailslots. но вот я вижу что mailslots для этого не совсем подходит.
но! так как препод говорил, что можно в качестве буфера использовать файл, то я сделал через файл. по сему факту вопрос на данный момент снят.

спасибо за помощь.

Последний раз редактировалось lowercase; 15.12.2012 в 18:33.
lowercase вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Запись и чтение файлов Bugrimov Общие вопросы C/C++ 14 09.11.2012 09:49
Работа с Mailslot Delphi asoll05 Помощь студентам 0 22.05.2011 15:52
MailSlot Sparky Общие вопросы .NET 8 04.03.2011 18:27
Чтение/запись структуры Кипящий чайник Общие вопросы C/C++ 10 19.01.2011 21:15
Чтение>сортировка>запись theFEAR Помощь студентам 1 22.04.2009 09:33