这是我第一次使用Unix域套接字,我使用.NET 5.0创建了以下控制台应用程序来学习Unix域套接字。我在这里找到了代码(https://medium.com/codex/unix-domain-sockets-in-net-6-basics-and-real-world-examples-8982898ab293)
我的期望是,类似于TCP/IP套接字连接,我将能够在客户端和服务器之间交谈,但使用Unix域套接字代替。
class Program
{
static void Main(string[] args)
{
const string Hostname = "localhost";
const string UnixSocketPath = "/tmp/foo.sock";
using var socket = new Socket(AddressFamily.Unix, SocketType.Stream, ProtocolType.IP);
var endpoint = new UnixDomainSocketEndPoint(UnixSocketPath);
socket.Connect(endpoint);
var requestBytes = System.Text.Encoding.UTF8.GetBytes($"GET / HTTP/1.0\r\nHost: {Hostname}\r\nAccept: */*\r\n\r\n");
socket.Send(requestBytes);
byte[] receivedBytes = new byte[1024];
socket.Receive(receivedBytes, 1024, SocketFlags.None);
Console.WriteLine(System.Text.Encoding.UTF8.GetString(receivedBytes));
}
}
当我尝试运行我的应用程序时,我收到以下错误:
在socket.Connect(端点)行中出现“套接字操作遇到了一个死网络”。我有以下问题:
1.上述控制台应用程序是否预期在Windows系统中运行?
1.在阅读几篇文章后,我了解到“UnixSocketPath”是Unix机器中遵循的基于文件的路径。如果是Windows机器,它指的是什么?或者它只是在应用程序的输出目录中创建的临时文件。
我尝试了以下方法来解决错误“套接字操作遇到了一个死网络”后,阅读了一点这:
1.尝试在管理模式下运行应用程序-不工作,同样的错误
1.切换到.net core 3. 0(即使我在使用.net 5. 0时没有遇到任何编译时错误)
- 不起作用,相同错误。
1.尝试将“UnixSocketPath”更改为本地路径(例如:C:/测试/foo.sock)-不工作,错误:“由于目标计算机主动拒绝,无法建立连接。C:/Test/foo.sock”
请原谅我的这些菜鸟级的问题,整个套接字级编程对我来说是新的,我现在很困惑。任何建议都是赞赏。谢谢
1条答案
按热度按时间yqhsw0fo1#
从您发布的链接:
要在基于Windows的系统上运行该示例,我可以推荐WSL 2。Visual Studio和Visual Studio Code附带了出色的远程集成,因此您可以直接从开发环境运行代码。
WSL是“用于Linux的Windows子系统”,即与Windows主机有一些集成的Linux虚拟机。
所以你需要在这个WSL环境中运行你的程序,并且正确地配置它。
然而,如果你只是想让你的服务器和客户机互相交流,我会考虑这是否真的是正确的方法。虽然unix域套接字可能有一些性能优势,你需要两个应用程序在同一台计算机上运行。我会使用一些基于消息的协议,而不是试图最小化消息的数量和大小。