Шустрый

Профиль
Группа: Участник
Сообщений: 96
Регистрация: 6.5.2005
Репутация: 2 Всего: 1
|
в продолжении темы решил попробовать использовать айпишные функции хочу передавать данные посредством отображения в память теперь 2 процесса: сервер и клиент но проблема-не знаю как записать и считать данные по полученному адресу в обычном Си легко это делаю с помощью команд putch(*((LPSTR)lpFileMap)) и *((LPSTR)lpFileMap) = chr где chr-типа char но в С# нет типа анлогичных HANDLE, LPVOID, там есть только один IntPtr в пиведённом ниже коде получаю указатель на отображаемую область памяти, но как изменить содержимое, и как считать данные не знаю работа прог заключается в следущем: когда в клиенте что-нибудь вводишь, то этот символ должен отображаться в сервере. как правильно это сделать? вот код сервера: | Код | using System; using System.Collections.Generic; using System.Runtime.InteropServices; using System.Diagnostics; using System.Text; using System.Security.Permissions;
namespace MapS { class Program { [DllImport("Kernel32.dll", CharSet = CharSet.Auto)] public static extern IntPtr CreateEvent(IntPtr even, bool tf1, bool tf2, string name);
[DllImport("Kernel32.dll", CharSet = CharSet.Auto)] public static extern IntPtr CreateFileMapping(UIntPtr even, IntPtr even2, Int32 falgs, Int32 a, Int32 b, string name);
[DllImport("Kernel32.dll", CharSet = CharSet.Auto)] public static extern IntPtr MapViewOfFile(IntPtr hMap, Int32 flags, Int32 a, Int32 b, Int32 c);
[DllImport("Kernel32.dll", CharSet = CharSet.Auto)] public static extern UInt32 WaitForMultipleObjects(Int32 n, IntPtr[] handl, bool flags, UInt32 atr);
[DllImport("Kernel32.dll", CharSet = CharSet.Auto)] public static extern void CloseHandle(IntPtr hEvent);
[DllImport("Kernel32.dll", CharSet = CharSet.Auto)] public static extern void UnmapViewOfFile(IntPtr lpFileMap);
[DllImport("Kernel32.dll", CharSet = CharSet.Auto)] public static extern Int32 GetLastError();
const int ERROR_ALREADY_EXISTS = 0xb7; const int PAGE_READWRITE = 0x4; const int FILE_MAP_READ = 0x4; const int FILE_MAP_WRITE = 0x2; const uint INFINITE = 0xffffffff; const int WAIT_ABANDONED_0 = 0x80; const int WAIT_OBJECT_0 = 0x0; const uint WAIT_FAILED = 0xffffffff;
static void Main(string[] args) { // Идентификаторы объектов-событий, которые используются // для синхронизации задач, принадлежащих разным процессам IntPtr hEventChar; IntPtr hEventTermination; IntPtr[] hEvents = new IntPtr[2];
// Имя объекта-события для синхронизации ввода и отображения string lpEventName = "MyVerySpecialEventName";
// Имя объекта-события для завершения процесса string lpEventTerminationName = "MyVerySpecialEventTerminationName";
// Имя отображния файла на память string lpFileShareName = "MyVerySpecialFileShareName";
// Идентификатор отображения файла на память IntPtr hFileMapping;
// Указатель на отображенную область памяти IntPtr lpFileMap; UInt32 dwRetCode; // Создаем объект-событие для синхронизации // ввода и отображения, выполняемого в разных процессах hEventChar = CreateEvent(IntPtr.Zero, false, false, lpEventName); // Если произошла ошибка, получаем и отображаем ее код, // а затем завершаем работу приложения if(hEventChar == IntPtr.Zero) { Console.WriteLine("CreateEvent: Error {0}\n",GetLastError()); Console.ReadKey(); return; } // Если объект-событие с указанным именем существует, // считаем, что приложение EVENT уже было запущено if(GetLastError() == ERROR_ALREADY_EXISTS) { Console.WriteLine("Application EVENT already started\nPress any key to exit..."); Console.ReadKey(); return; } // Создаем объект-событие для определения момента // завершения работы процесса ввода hEventTermination = CreateEvent(IntPtr.Zero, false, false, lpEventTerminationName); if(hEventTermination == IntPtr.Zero) { Console.WriteLine("CreateEvent (Termination): Error {0}",GetLastError()); Console.ReadKey(); return ; } // Создаем объект-отображение hFileMapping = CreateFileMapping((UIntPtr)0xFFFFFFFF, IntPtr.Zero, PAGE_READWRITE, 0, 100, lpFileShareName); // Если создать не удалось, выводим код ошибки if(hFileMapping == IntPtr.Zero) { Console.WriteLine("CreateFileMapping: Error {0}",GetLastError()); Console.ReadKey(); return; } // Выполняем отображение файла на память // В переменную lpFileMap будет записан указатель на // отображаемую область памяти lpFileMap = MapViewOfFile(hFileMapping, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0); // Если выполнить отображение не удалось, // выводим код ошибки if(lpFileMap.ToInt32() == 0) { Console.WriteLine("MapViewOfFile: Error {0}",GetLastError()); Console.ReadKey(); return; } // Готовим массив идентификаторов событий // для функции WaitForMultipleObjects hEvents[0] = hEventTermination; hEvents[1] = hEventChar;
// Цикл отображения. Этот цикл завершает свою работу // при завершении процесса ввода Console.WriteLine("Ждёмс\n");
while(true) { // Выполняем ожидание одного из двух событий: // - завершение клиентского процесса; // - завершение ввода символа dwRetCode = WaitForMultipleObjects(2,hEvents, false, INFINITE);
// Если ожидание любого из двух событий было отменено, // если произошло первое событие (завершение клиентского // процесса) или если произошла ошибка, прерываем цикл if(dwRetCode == WAIT_ABANDONED_0 ||dwRetCode == WAIT_ABANDONED_0 + 1 || dwRetCode == WAIT_OBJECT_0 || dwRetCode == WAIT_FAILED) break;
// Читаем символ из первого байта отображенной // области памяти, записанный туда клиентским // процессом, и отображаем его в консольном окне //КАК ПРАВИЛЬНО ЭТО СДЕЛАТЬ? Console.Write(lpFileMap+"\n");
} // Закрываем идентификаторы объектов-событий CloseHandle(hEventChar); CloseHandle(hEventTermination);
// Отменяем отображение файла UnmapViewOfFile(lpFileMap);
// Освобождаем идентификатор созданного // объекта-отображения CloseHandle(hFileMapping); Console.ReadLine(); } } }
|
вот код клиента | Код | using System; using System.Collections.Generic; using System.Runtime.InteropServices; using System.Drawing; using System.Drawing.Drawing2D; using System.Drawing.Imaging; using System.Diagnostics; using System.Text; using System.Security.Permissions; using System.Windows.Forms;
[assembly: UIPermissionAttribute(SecurityAction.RequestMinimum, Clipboard = UIPermissionClipboard.AllClipboard, Window = UIPermissionWindow.AllWindows)]
namespace MapC { class Program { [DllImport("Kernel32.dll", CharSet = CharSet.Auto)] public static extern IntPtr OpenEvent(Int32 flags, bool tf, string name);
[DllImport("Kernel32.dll", CharSet = CharSet.Auto)] public static extern IntPtr OpenFileMapping(Int32 flags, bool tf, string name);
[DllImport("Kernel32.dll", CharSet = CharSet.Auto)] public static extern IntPtr MapViewOfFile(IntPtr hFileMapping, Int32 flags, Int32 a, Int32 b, Int32 c);
[DllImport("Kernel32.dll", CharSet = CharSet.Auto)] public static extern void SetEvent(IntPtr hEvent);
[DllImport("Kernel32.dll", CharSet = CharSet.Auto)] public static extern void CloseHandle(IntPtr hEvent);
[DllImport("Kernel32.dll", CharSet = CharSet.Auto)] public static extern void UnmapViewOfFile(IntPtr lpFileMap);
[DllImport("Kernel32.dll", CharSet = CharSet.Auto)] public static extern Int32 GetLastError();
[DllImport("Kernel32.dll", CharSet = CharSet.Auto)] public static extern bool WriteFile(IntPtr handle, IntPtr buf, Int64 siz, IntPtr kol, IntPtr atr);
const int EVENT_ALL_ACCESS = 0x1f0003; const int FILE_MAP_READ = 0x4; const int FILE_MAP_WRITE = 0x2;
static void Main(string[] args) {
// Идентификаторы объектов-событий, которые используются // для синхронизации задач, принадлежащих разным процессам IntPtr hEvent; IntPtr hEventTermination;
// Имя объекта-события для синхронизации ввода и отображения string lpEventName = "MyVerySpecialEventName";
// Имя объекта-события для завершения процесса string lpEventTerminationName = "MyVerySpecialEventTerminationName";
// Имя отображния файла на память string lpFileShareName = "MyVerySpecialFileShareName";
// Идентификатор отображения файла на память IntPtr hFileMapping;
// Указатель на отображенную область памяти IntPtr lpFileMap;
char chr;
// Открываем объект-событие для синхронизации // ввода и отображения hEvent = OpenEvent(EVENT_ALL_ACCESS, false, lpEventName);
if (hEvent == IntPtr.Zero) { Console.WriteLine("OpenEvent: Error {0}", GetLastError()); Console.ReadKey(); return; }
// Открываем объект-событие для сигнализации о // завершении процесса ввода hEventTermination = OpenEvent(EVENT_ALL_ACCESS, false, lpEventTerminationName); if(hEventTermination == IntPtr.Zero) { Console.WriteLine("OpenEvent (Termination): Error {0}", GetLastError()); Console.ReadKey(); return; }
// Открываем объект-отображение hFileMapping = OpenFileMapping(FILE_MAP_READ | FILE_MAP_WRITE, false, lpFileShareName);
// Если открыть не удалось, выводим код ошибки if(hFileMapping == IntPtr.Zero) { Console.WriteLine("OpenFileMapping: Error {0}",GetLastError()); Console.ReadKey(); return; }
// Выполняем отображение файла на память. // В переменную lpFileMap будет записан указатель на // отображаемую область памяти lpFileMap = MapViewOfFile(hFileMapping, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0);
// Если выполнить отображение не удалось, // выводим код ошибки if(lpFileMap.ToInt32() == 0) { Console.WriteLine("MapViewOfFile: Error {0}",GetLastError()); Console.ReadKey(); return; }
Console.WriteLine("Введите что нибудь\n");
// Цикл ввода. Этот цикл завершает свою работу, // когда пользователь нажимает клавишу <ESC>, // имеющую код 27
while (true) { // Проверяем код введенной клавиши chr = Console.ReadKey().KeyChar;
// Если нажали клавишу <ESC>, прерываем цикл if ((int)chr == 27) break;
// Записываем символ в отображенную память, // доступную серверному процессу //КАК ПРАВИЛЬНО ЭТО СДЕЛАТЬ? lpFileMap = (IntPtr)chr; Console.WriteLine("\nВы ввели "+chr); Console.WriteLine("lpFileMap = {0}\n", lpFileMap.ToString()); // Устанавливаем объект-событие в отмеченное // состояние SetEvent(hEvent); }
// После завершения цикла переключаем оба события // в отмеченное состояние для отмены ожидания в // процессе отображения и для завершения этого процесса SetEvent(hEvent); SetEvent(hEventTermination);
// Закрываем идентификаторы объектов-событий CloseHandle(hEvent); CloseHandle(hEventTermination);
// Отменяем отображение файла UnmapViewOfFile(lpFileMap);
// Освобождаем идентификатор созданного // объекта-отображения CloseHandle(hFileMapping); } } }
|
ну вот вроде и всё, заранее спасибо
|