如何使用UnixDomainSocketEndPoint在dotnet中创建Unix套接字?

问题描述

我有一个用C编写的程序,需要将数据发送到另一个用C#编写的应用程序。

有人可以展示有关如何在Linux上使用UnixDomainSocketEndPoint的基本例子吗?。我希望将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,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,buffer.Length,SocketFlags.None);

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

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

    }
}