Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/79: Рейтинг темы: голосов - 79, средняя оценка - 4.63
 Аватар для Gepar
1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517

Создание каналов (pipe)

04.09.2012, 18:22. Показов 14757. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть задание по криптографии где нужно написать клиент-сервреное приолжение. Сервер должен открывать каналы (pipe) для подключения к нему и давать возможность авторизироваться (принимать по этому каналу связку логин-пароль) ну и отвечать на запросы к нему через этот же канал. Именованый канал должен быть такой чтобы к нему можно было подключиться по локальной сети (зная о том что это за канал конечно).
В общем-то вариантов у меня грубо говоря 3:
1)Делать это на чистом с++ с использованием pipe и стандарта POSIX, который windows поддерживает.
2)Делать это с использованием WINAPI и чисто виндовых особенностей по созданию каналов.
3)Разобраться как создавать эти каналы для подключения на c#.

Интересует вариант 3 Подскажите где можно почитать о реализации чего-то с использованием pipe каналов ну или если у кого есть пример на c# то поделитесь пожалуйста.
Если считаете что это глупая затея (реализация этого на c#) и что проще такое сделать на с++ + winapi то напишите об этом, я пока не решился до конца: идти против течения и протаптывать дорожку в c# при написании приложения или пойти по дорожке по которой я уже ходил и использовать чистый winapi.

Добавлено через 1 минуту
*Блин, я думал что я в разделе c#.NET. Перенесите пожалуйста тему ....
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.09.2012, 18:22
Ответы с готовыми решениями:

Передачай значений переменных между двумя разными програмами с помощью каналов PIPE
Здраствуйте уважаемые программисты!! Нужна помащь с передачай значений переменных между двумя разными програмами,в общем есть к примеру...

Создание защищенных каналов
Добрый день всем! Вот хотел бы уточнить, кто сталкивался. Поставили задачу, сделать защищеный канал для передачи персональных даны. Вот я...

Spring динамическое создание каналов
Вообщем пишу веб-приложения для работы с Rss рассылками с использованием spring, hibernate. Прочитал ,что в spring есть feed adapter. Можно...

3
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
04.09.2012, 19:18
Гляньте вот эту статейку: http://msdn.microsoft.com/en-u... 00%29.aspx
1
 Аватар для Gepar
1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
14.09.2012, 11:11  [ТС]
Лучший ответ Сообщение было отмечено Gepar как решение

Решение

Наконец-то дошли руки до этого задания. Итак есть проблема: пример с msdn не работает.
Привожу код сервера:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
using System;
using System.IO;
using System.IO.Pipes;
using System.Threading;
 
class PipeServer
{
    static int numThreads = 4;
 
    static void Main()
    {
        for (int i = 0; i < numThreads; i++)
        {
            Thread newThread = new Thread(new ThreadStart(ServerThread));
            newThread.Start();
        }
        Console.WriteLine("Press enter to exit.");
        Console.ReadLine();
    } // Main()
 
    private static void ServerThread()
    {
        using (NamedPipeServerStream pipeServer =
            new NamedPipeServerStream("testpipe", PipeDirection.InOut, numThreads))
        {
            Console.WriteLine("NamedPipeServerStream thread created.");
 
            // Wait for a client to connect
            pipeServer.WaitForConnection();
 
            Console.WriteLine("Client connected.");
            try
            {
                // Read the request from the client. Once the client has
                // written to the pipe its security token will be available.
                using (StreamReader sr = new StreamReader(pipeServer))
                using (StreamWriter sw = new StreamWriter(pipeServer))
                {
                    sw.AutoFlush = true;
 
                    // Verify our identity to the connected client using a
                    // string that the client anticipates.
                    sw.WriteLine("I am the true server!");
 
                    // Obtain the filename from the connected client.
                    string filename = sr.ReadLine();
 
                    // Read in the contents of the file while impersonating
                    // the client.
                    ReadFileToStream fileReader = new
                        ReadFileToStream(pipeServer, filename);
 
                    // Display the name of the user we are impersonating.
                    Console.WriteLine("Reading file: {0} as user {1}.",
                        pipeServer.GetImpersonationUserName(), filename);
 
                    pipeServer.RunAsClient(fileReader.Start);
 
                    pipeServer.Disconnect();
                }
           }
            // Catch the IOException that is raised if the pipe is broken
            // or disconnected.
            catch (IOException e)
            {
                Console.WriteLine("ERROR: {0}", e.Message);
            }
        }
    } // ServerThread()
} // PipeServer
 
class ReadFileToStream
{
    private string m_filename;
    private Stream m_stream;
 
    public ReadFileToStream(Stream stream, string filename)
    {
        m_filename = filename;
        m_stream = stream;
    } // ReadFileToStream(stream, filename)
 
    public void Start()
    {
        using (StreamWriter sw = new StreamWriter(m_stream))
        {
            string contents = File.ReadAllText(m_filename);
            sw.WriteLine(contents);
            sw.Flush();
        }
    } // Start()
} // ReadFileToStream
Код клиента
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
using System;
using System.IO;
using System.IO.Pipes;
using System.Text;
using System.Security.Principal;
using System.Diagnostics;
using System.Threading;
 
public class PipeClient
{
    private static int numClients = 4;
 
    public static void Main(string[] Args)
    {
        if (Args.Length > 0)
        {
            if (Args[0] == "spawnclient")
            {
                NamedPipeClientStream pipeClient =
                    new NamedPipeClientStream(".", "testpipe",
                        PipeDirection.InOut, PipeOptions.None,
                        TokenImpersonationLevel.Impersonation);
 
                Console.WriteLine("Connecting to server...\n");
                pipeClient.Connect();
 
                StreamString ss = new StreamString(pipeClient);
                // Validate the server's signature string
                if (ss.ReadString() == "I am the one true server!")
                {
                    // The client security token is sent with the first write.
                    // Send the name of the file whose contents are returned
                    // by the server.
                    ss.WriteString("c:\\textfile.txt");
 
                    // Print the file to the screen.
                    Console.Write(ss.ReadString());
                }
                else
                {
                    Console.WriteLine("Server could not be verified.");
                }
                pipeClient.Close();
                // Give the client process some time to display results before exiting.
                Thread.Sleep(4000);
            }
        }
        else
        {
            Console.WriteLine("\n*** Named pipe client stream with impersonation example ***\n");
            StartClients();
        }
    }
 
    // Helper function to create pipe client processes
    private static void StartClients()
    {
        int i;
        string currentProcessName = Environment.CommandLine;
        Process[] plist = new Process[numClients];
 
        Console.WriteLine("Spawning client processes...\n");
 
        if (currentProcessName.Contains(Environment.CurrentDirectory))
        {
            currentProcessName = currentProcessName.Replace(Environment.CurrentDirectory, String.Empty);
        }
 
        // Remove extra characters when launched from Visual Studio
        currentProcessName = currentProcessName.Replace("\\", String.Empty);
        currentProcessName = currentProcessName.Replace("\"", String.Empty);
 
        for (i = 0; i < numClients; i++)
        {
            // Start 'this' program but spawn a named pipe client.
            plist[i] = Process.Start(currentProcessName, "spawnclient");
        }
        while (i > 0)
        {
            for (int j = 0; j < numClients; j++)
            {
                if (plist[j] != null)
                {
                    if (plist[j].HasExited)
                    {
                        Console.WriteLine("Client process[{0}] has exited.",
                            plist[j].Id);
                        plist[j] = null;
                        i--;    // decrement the process watch count
                    }
                    else
                    {
                        Thread.Sleep(250);
                    }
                }
            }
        }
        Console.WriteLine("\nClient processes finished, exiting.");
    }
}
 
// Defines the data protocol for reading and writing strings on our stream
public class StreamString
{
    private Stream ioStream;
    private UnicodeEncoding streamEncoding;
 
    public StreamString(Stream ioStream)
    {
        this.ioStream = ioStream;
        streamEncoding = new UnicodeEncoding();
    }
 
    public string ReadString()
    {
        int len;
        len = ioStream.ReadByte() * 256;
        len += ioStream.ReadByte();
        byte[] inBuffer = new byte[len];
        ioStream.Read(inBuffer, 0, len);
 
        return streamEncoding.GetString(inBuffer);
    }
 
    public int WriteString(string outString)
    {
        byte[] outBuffer = streamEncoding.GetBytes(outString);
        int len = outBuffer.Length;
        if (len > UInt16.MaxValue)
        {
            len = (int)UInt16.MaxValue;
        }
        ioStream.WriteByte((byte)(len / 256));
        ioStream.WriteByte((byte)(len & 255));
        ioStream.Write(outBuffer, 0, len);
        ioStream.Flush();
 
        return outBuffer.Length + 2;
    }
}
После того как я всё это собираю сервер запускается и ждёт подключений, а клиент при попытке выполнить
C#
1
sw.AutoFlush = true;
Валиться с исключением InvalidOperation: Канал ещё не подключён. Что я делаю не так? Ведь это пример прямо из msdn.

Добавлено через 10 часов 38 минут
Есть какие предположения? Ато на winapi каналы создаются и работают, а на с# - нет.
У меня win7 x64 если что, как исправить эту проблему?
0
0 / 0 / 0
Регистрация: 25.12.2018
Сообщений: 2
19.06.2019, 08:03
c:\\textfile.txt
У вас есть этот файл, смотрите код. У меня этот пример работает
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
19.06.2019, 08:03
Помогаю со студенческими работами здесь

Создание VPN-каналов. Сам не разберусь!
Уважаемые форумчане! Помогите решить такую задачу: 1. Есть головной офис с локальной сетью (порядка 30 компов), интернет подключен...

Pipe
Напишите пожалуйста код программы с функцией pipe.

Чтение из pipe
Имеется испонимый файл (консольное приложение), выводящий, например, &quot;Hello? world!&quot; Требуется из консольного приложения запустить...

Broken pipe
Narod, help! Chto eto za oshibka? i kak eje pravit'

Read in Pipe
Здравствуйте, пишу программу с pipe(). Возникла такая проблема, что в функции receive() возникает зависание. Прошу помочь исправить ошибку....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru