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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.03.2010, 18:57   #1
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию Реализация коммуникации

Добрый вечер! Есть задание написать сервер и клиент использующие mailslot для коммуникации
Вот код сервера:
Код:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using ChatClient;

namespace MailSlot_application
{
    public partial class FormMain : Form
    {
        public FormMain()
        {
            InitializeComponent();
        }

        private void buttonCreate_Click(object sender, EventArgs e)
        {
            bool flag = true;   //флаг указывающий нужно ли продолжать опрос
            int max_size = 32767;   //макс размер сообщения
            uint next_size=0;   //размер следующего сообщения  
            uint count = 0; //количество сообщений
            byte[] buf={}; //буфер для хранения сообщения
            uint real_size = 0;  //количество реально считанных байт

            //создание MailSlot
            int ms = Import.CreateMailslot("\\\\.\\mailslot\\my", 0, Types.MAILSLOT_WAIT_FOREVER, 0);
            if (ms == -1) MessageBox.Show("ошибка при создании");
            else
            {
                buttonCreate.Enabled = false;

                //проверка состояния mailslot
                while (flag)
                {
                    if (Import.GetMailslotInfo(ms, max_size, ref next_size, ref count, Types.MAILSLOT_WAIT_FOREVER))
                    {
                        if (count != 0) //если есть сообщение
                        {
                            real_size = 0;  //обнуление реального размера сообщенич
                            textBox1.Clear();
                            Import.ReadFile(ms, buf, (uint)buf.Length, ref real_size, 0);

                            //конвертизация в строку
                            byte[] RetValue = new byte[real_size];
                            System.Array.Copy(buf, RetValue, real_size);
                            string temp = System.Text.Encoding.Default.GetString(RetValue);
                            if (temp != "exit") //если пришла не команда выхода то вывести сообщение
                                textBox1.Text = temp;
                            else
                            {   
                                //в противном случае выйти из цикла проверки и вывести сообщение
                                flag = false;
                                textBox1.Text = "работа завершена";
                            }
                        }
                    }
                }
                Import.CloseHandle(ms); //закрыть маилслот
                buttonCreate.Enabled=true; 
            }
        }
    }
}
Вот код клиента:
Код:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using ChatClient; 

namespace MailSlot_application_client
{
    public partial class FormMain : Form
    {
        public FormMain()
        {
            InitializeComponent();
        }

        private void buttonSend_Click(object sender, EventArgs e)
        {
            byte[] mes; //содержимое сообщения
            uint real_size = 0; //колчиство реально прочитанных байт
            //открытие маилслота
            int ms = Import.CreateFile("\\\\.\\mailslot\\ClientMailslot", Types.EFileAccess.GenericWrite, Types.EFileShare.Read, 0, Types.ECreationDisposition.OpenExisting, 0, 0);

            if (ms == -1) MessageBox.Show("ошибка при открытии");
            else
            {
                real_size = 0;  //обнуление реального размера сообщенич
                mes = System.Text.Encoding.Default.GetBytes(textBox1.Text);
                Import.WriteFile(ms, mes, (uint)mes.Length, ref real_size, 0);
                Import.CloseHandle(ms);
            }

        }
    }
}
При запуске сервера на строке
Код:
if (Import.GetMailslotInfo(ms, max_size, ref next_size, ref count, Types.MAILSLOT_WAIT_FOREVER))
выдается ошибка:
Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память повреждена.
Что длеать как исправить?
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 21.03.2010, 18:58   #2
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

GetMailslotInfo(), вот ее параметры
hMailslot - дескриптор канала Mailslot;
lpMaxMessageSize - максимальный размер сообщения;
lpNextSize – размер следующего сообщения;
lpMessageCount – количество сообщений;
lpReadTimeout – время ожидания.

функция ReadFile(), ее параметры
hFile – дескриптор реализации канала;
lpBuffer – адрес буфера, куда будут прочитаны данные из канала;
lpNumberOfBytesWritten – размер буфера;
lpNumberOfBytesWritten - число байт, действительно прочитанных из канала;
lpOverlapped – зависит от режима работы.
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Реализация ГОСТ Р 34.10-94 Stefaniya Свободное общение 4 13.05.2010 22:21
Ctrl+Z реализация delphin100 Общие вопросы Delphi 6 10.09.2008 06:59
Реализация конфигуратора BlackOmen Общие вопросы Delphi 3 30.05.2008 17:12
Реализация тестов aleksei111 Общие вопросы Delphi 2 20.05.2008 12:15
коммуникации Cannibal Компьютерное железо 2 15.03.2008 21:50