[英]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.