Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Использование почтовых ящиков для обмена данными м, Не работает почтовый ящик 
V
    Опции темы
Nastya2410
Дата 19.4.2014, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 19.4.2014

Репутация: нет
Всего: нет



Здравствуйте . Пытаюсь освоить механизм почтовых ящиков (mailslot). Суть я понимаю : есть сервер и есть клиент (читатель и писатель) . Клиент посылает сообщение серверу, а сервер читает его . 

Вот коды сервера и клиента. 


Сервер:
Код

#include "stdafx.h"
#include <windows.h>
#include <conio.h>
#include <stdio.h>
#include <iostream>
using namespace std;
 
BOOL fReturnCode ; //код возвращения с функций
DWORD cbMessages ; //размер сообщения
DWORD cbMsgNumber ; //количество сообщений в MailSlot
 
HANDLE hMailSlot; //дескриптор почты
LPCWSTR MailSlotName=(LPCWSTR)"\\.\mailslot\$FirstMailSlot"; //имя почты
 
char buf [512]; //буфер для приёма данных
DWORD  cbRead ; //количество байтов данных, принятых через MailSlot
 
int _tmain(int argc, _TCHAR* argv[])
{
    //создаём почтовый ящик:
    hMailSlot=CreateMailslot(MailSlotName,0,MAILSLOT_WAIT_FOREVER,NULL);
    //если возникла ошибка-выход с программы
    if(hMailSlot==INVALID_HANDLE_VALUE)
    { cout<<"Error MailSlot Creating!"<<endl;
      getch();
      return 0;
    }
    while(1)
    {//определяем состояние MailSlot
      fReturnCode=GetMailslotInfo(hMailSlot,NULL,&cbMessages,&cbMsgNumber,NULL);
      if(!fReturnCode)
      {cout<<"Get MailSlotInfo Error!"<<endl;
      getch();
      return 0;
      }
 
      //если в MailSlot есть сообщение , то читаем первое
      if(cbMsgNumber!=0)
      {
          if(ReadFile(hMailSlot,buf,512,&cbRead,NULL))
              printf("Received %d bytes: <%s>\n",cbRead,buf);
          else printf("Error data transfer!\n");
          break;
      }
    }
    getch();
    CloseHandle(hMailSlot);
    return 0;
}


Клиент:
Код

#include "stdafx.h"
#include <windows.h>
#include <conio.h>
#include <stdio.h>
#include <iostream>
using namespace std;
 
HANDLE hMailSlot; //дескриптор почты
LPCWSTR MailSlotName=(LPCWSTR)"\\.\mailslot\$FirstMailSlot"; //имя почты
char buf [512]; //буфер для передачи данных
DWORD  cbWritten ; //количество байтов данных, переданных через MailSlot
 
int _tmain(int argc, _TCHAR* argv[])
{
    //открываем почтовый ящик:
    hMailSlot=CreateFile(MailSlotName,GENERIC_WRITE,FILE_SHARE_READ,NULL,OPEN_EXISTING,0,NULL);
    //если возникла ошибка-выход с программы
    if(hMailSlot==INVALID_HANDLE_VALUE)
    { cout<<"Error CreateFile!"<<endl;
      getch();
      return 0;
    }
 
    //передача данных через Mailslot
 
    strcpy(buf,"Test connection");
    if(!WriteFile(hMailSlot,buf,strlen(buf)+1,&cbWritten,NULL))
        printf("Error data transfer\n");
    else printf("Transferred %d bytes : <%s>\n",cbWritten,buf);
    CloseHandle(hMailSlot);
    getch();
    return 0;
}


Ошибок не выдаёт, но и не работает . При компиляции каждого по отдельности выводит сообщения "Error MailSlot Creating" и "Error CreateFile". Я так понимаю, нужно запустить .exe файлы клиента и сервера вместе .

В чём может быть моя ошибка? Может почтовый ящик неправильно создаю? Подскажите, пожалуйста. 

PM MAIL   Вверх
GremlinProg
Дата 19.4.2014, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(Nastya2410 @  19.4.2014,  16:12 Найти цитируемый пост)
LPCTSTR MailSlotName=TEXT( "\\.\mailslot\$FirstMailSlot" ); //имя почты 


Добавлено через 38 секунд
начните с этого


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Nastya2410
Дата 19.4.2014, 22:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 19.4.2014

Репутация: нет
Всего: нет



Исправила. 
Сделала проверку на ошибки :


Код

if(hMailSlot==INVALID_HANDLE_VALUE)
    { cout<<"Error CreateFile!"<<endl;
      int error=GetLastError();
      cout<<error;
      getch();
      return 0;
    }



В клиенте код ошибки 2 (ERROR_FILE_NOT_FOUND
2 (0x2)
The system cannot find the file specified.).

В сервере код ошибки 123 (ERROR_INVALID_NAME
123 (0x7B)
The filename, directory name, or volume label syntax is incorrect.). 


Что неправильного ? Не пойму :( . Имя уже переделала.
PM MAIL   Вверх
feodorv
Дата 20.4.2014, 03:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 9
Всего: 45



Цитата(Nastya2410 @  19.4.2014,  23:45 Найти цитируемый пост)
Что неправильного ?

Ну, в строковых литералах "..." нужно использовать двойные слеши, чтобы задать один символ слеш:
Цитата(Nastya2410 @  19.4.2014,  15:12 Найти цитируемый пост)
"\\\\.\\mailslot\\$FirstMailSlot"



Это сообщение отредактировал(а) feodorv - 20.4.2014, 03:31


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0501 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.