问题描述
我有一个用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}");
}
}
}