簡體   English   中英

如何使用 UnixDomainSocketEndPoint 在 dotnet 中創建 unix 套接字?

[英]How to use UnixDomainSocketEndPoint to create a unix socket in dotnet?

我有一個用 C 編寫的程序,它需要將數據發送到另一個用 C# 編寫的應用程序。

有人可以展示一個關於如何在 linux 上使用UnixDomainSocketEndPoint的基本 hello world 示例嗎? . 我希望 c# 應用程序成為服務器。 換句話說,C 應用程序將向 C# 應用程序發送數據。 如何創建一個將在 dotnet 上偵聽數據的 unix 套接字(應用程序不需要回復任何內容)?


在互聯網上研究時,我發現的所有內容都與單聲道相關,例如這個問題: How to connect to a Unix Domain Socket in .NET Core in C# 我試過那個例子,但沒有用。 此外,它不使用 UnixDomainSocketEndPoint。

我還發現本教程https://medium.com/@goelhardik/http-connection-to-unix-socket-from-dotnet-core-in-c-21d19ef08f8a使用相同的代碼。

也許網上沒有那么多例子,因為它比我想象的更簡單。 我能夠在不研究互聯網的情況下回答這個問題。 我應該在問之前試過。 無論如何,這里是答案:

using System;
using System.Net.Sockets;
using System.Threading.Tasks;

class Program
{
    static void Main(string[] args)
    {
        var path = "/tmp/foo.sock";

        // client
        Task.Run(async () =>
        {
            // wait 2 seconds
            await Task.Delay(2000);

            using (var socket = new Socket(AddressFamily.Unix, SocketType.Stream, ProtocolType.Unspecified))
            {
                socket.Connect(new UnixDomainSocketEndPoint(path));

                // send hello world
                var dataToSend = System.Text.Encoding.UTF8.GetBytes("Hello-world!");

                socket.Send(dataToSend);
            }
        });

        // Server
        {
            // delete file if it exists
            if (System.IO.File.Exists(path))
                System.IO.File.Delete(path);

            var socket = new Socket(AddressFamily.Unix, SocketType.Stream, ProtocolType.Unspecified);
            socket.Bind(new UnixDomainSocketEndPoint(path));
            socket.Listen(5);
            Console.WriteLine("Server started waiting for client to connect...");

            var s = socket.Accept();

            Console.WriteLine("Client connected");

            var buffer = new byte[1024];
            var numberOfBytesReceived = s.Receive(buffer, 0, buffer.Length, SocketFlags.None);

            var message = System.Text.Encoding.UTF8.GetString(buffer, 0, numberOfBytesReceived);

            Console.WriteLine($"Received: {message}");
        }

    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM