0

Wireguard ソース コードを使用して WireGuard プロトコル ベースの接続を確立するために、C# .NET Framework 4.6 で単純なコンソール アプリ クライアント (starter.exe) を作成しようとしています。

行われること:

  • ここからダウンロードしたワイヤーガードのソースコード: git://git.zx2c4.com/wireguard-windows
  • build.bat 経由で..\ embeddable-dll-service\amd64\tunnel.dll に Tunnel.dll が正常にビルドされました
  • ..\embeddable-dll-service\csharpの c# コードを使用して、Visual Studio 2015 でプロジェクトを作成しました。

ここから、いくつかの奇妙なことが起こっています。

  • starter.exe \service <path to *.conf> を起動すると、エラーが表示されます

サービス実行エラー: サービス プロセスがサービス コントローラーに接続できませんでした。

  • パラメータなしで starter.exe を起動すると、if{}ブロックを削除するまですべて正常に動作します。

未処理の例外: System.ComponentModel.Win32Exception: サービスは
、D:\Depository\BitBucket\WireGuard_Tunnel_Repository\WireGuardTunnel_proj\Launcher\Service の WireGuardTunnel.Service.Add(String configFile) で開始または制御要求にタイムリーに応答しませんでした。 cs: D:\Depository\BitBucket\WireGuard_Tunnel_Repository\WireGuardTunnel_proj\Launcher\Program.cs:line 83 の WireGuardTunnel.Program.Main(String[] args) の 69 行目

つまり、if{} ブロック内のコードが実行されなくても、何らかの形でアプリケーションの動作に影響を与えるということです。

  • 次に、アプリをパラメータで動作させたいので、Return afer Service.Run を削除し、args[1] を Service.Add(args[1]) に渡すことで問題を解決しました。問題なく動作しますが、ログに追加のログ行 (上記の Service.Run 永続エラーによる最初の行) があります。

サービス実行エラー: サービス プロセスがサービス コントローラーに接続できませんでした。
235660: [TUN] [chicago4] ネットワーク インターフェイス
の監視 245661: [TUN] [chicago4] DNS 名の解決
245661: [TUN] [chicago4] Wintun インターフェイスの作成
225660: [TUN] [chicago4] WireGuard/0.3.1 の起動 (Windows 6.1 .7601; amd64)

最後に質問:

  1. Service.Run(confFile) が機能しない理由
  2. Service.Run(confFile) が Service.Add(confFile) に影響を与える理由
  3. パラメータなしで starte.exe を起動すると if{} ブロックが実行される理由

変更されていない元の Program.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.Diagnostics;
using System.Threading;
using System.Threading.Tasks;
using System.IO;
using System.Runtime.InteropServices;

namespace Tunnel
{
    class Program
    {

        [DllImport("kernel32.dll")]
        private static extern bool SetConsoleCtrlHandler(SetConsoleCtrlEventHandler handler, bool add);
        private delegate bool SetConsoleCtrlEventHandler(UInt32 signal);

        public static void Main(string[] args)
        {
            string baseDirectory = Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName);
            string configFile = Path.Combine(baseDirectory, "demobox.conf");
            string logFile = Path.Combine(baseDirectory, "log.bin");

            if (args.Length == 2 && args[0] == "/service")
            {
                configFile = args[1];
                Service.Run(configFile);
                return;
            }

            try { File.Delete(logFile); } catch { }
            Ringlogger log = new Ringlogger(logFile, "GUI");

            var logPrintingThread = new Thread(() =>
            {
                var cursor = Ringlogger.CursorAll;
                while (Thread.CurrentThread.IsAlive)
                {
                    var lines = log.FollowFromCursor(ref cursor);
                    foreach (var line in lines)
                        Console.WriteLine(line);
                    Thread.Sleep(300);
                }
            });

            logPrintingThread.Start();

            SetConsoleCtrlHandler(delegate
            {
                Service.Remove(configFile);
                Environment.Exit(0);
                return true;
            }, true);

            try
            {
                Service.Add(configFile);
                logPrintingThread.Join();
            }
            finally
            {
                Service.Remove(configFile);
            }
        }
    }
}
4

0 に答える 0