交叉编译的 c# 套接字程序,适用于 win,但不适用于 mac

Posted

技术标签:

【中文标题】交叉编译的 c# 套接字程序,适用于 win,但不适用于 mac【英文标题】:Crosscompiled c# socket program, works on win, but not on mac 【发布时间】:2021-11-30 02:30:19 【问题描述】:

我有一个在 win 和 mac 之间交叉编译的套接字程序。它做了很多不同的事情,但它本质上是一个接收来自不同类型客户端的命令的套接字服务器。

客户端是用 NodeJs、c++ 编写的。

NodeJS 客户端在 windows 和 mac 上运行相同的代码,并且可以在两个平台上运行,除了套接字连接。

C# 套接字服务器看起来像这样,去掉了异常处理。

.
.
.

IPHostEntry ipHost = Dns.GetHostEntry("localhost");
IPAddress ipAddr = ipHost.AddressList[0];
IPEndPoint LocalEndPoint = new(ipAddr, 11111);
Socket listener = new(ipAddr.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
listener.Bind(LocalEndPoint);
listener.Listen(10);
while (true)
  Socket serverSocket = listener.Accept();
  byte[] recievedBytes = new byte[1024];
  string data;
  while (true)
    data=null;
    int numByte = serverSocket.Recieve(recievedBytes);
    data += Encoding.ASCII.GetString(recievedBytes, 0, numByte);
    ClientMessageDTO cMessage = new();
    cMessage = JsonSerializer.Deserialize<ClientMessageDTO>(data);
    string jsonMessage = executeSocketCommand.now(cMessage, list);
    sendMessage(serverSocket, jsonMessage);
    serverSocket.Disconnect(true);
    serverSocket.listener.Accept();
  

.
.
.

NodeJS 代码看起来像这样,去掉了异常处理。

.
.
.
const net = require("net");
const socket = new net.Socket();
socket.connect (11111, "localhost");
socket.write("\"command\":\"updateLicenseRelationshipList\",\"value\":\"\"", 
  socket.destroy();
);

.
.
.


在 Windows 上它可以工作,但在 mac 上客户端无法连接到服务器。它根本看不到它。

我尝试在 Mac 上根本不启动服务器,并得到相同的“错误:在 TCPConnectWrap.afterConnect 连接 ECONNREFUSED 127.0.0.1:11111 as oncolplete (net.js:1146:16)

我已经在互联网上寻找 Mac 和 Win 如何处理 localhost 的差异,但似乎找不到。 TCP 是标准的,需要作为标准处理,但尽管我认为这就是问题所在,因此尝试了 127.0.0.1 但这也不起作用。

服务器工作正常。我编写了一个连接到服务器的 c# 套接字测试程序,它可以在 Win 和 Mac 上运行,并且可以发送和接收消息。

有没有人知道这个问题是什么,并指出我正确的方向。

感谢您的宝贵时间。

【问题讨论】:

TCP 是标准的。它是一个字节流,而不是消息。因此,如果您想确保您正在处理的内容是整个 JSON 文档(而不是一个文档的一部分,也不是多个文档的一部分),则由 进行切片和切块接收到的字节,直到您可以组装一个(例如,在这里,您可能必须平衡,直到计数为0)。 感谢您的回答,但代码甚至无法发送任何内容。我把所有的通讯代码都删了,只试了连接,还是不行。 【参考方案1】:

我认为这是问题的答案,但我不确定......虽然它有效。

127.0.0.1 和 localhost 是相同的,并且是所有机器上的环回 ipaddress,它使进程能够通过 TCP v4 连接进行通信。无法在任何其他地址范围内读取发送到此地址的流量。但要使其在 localhost 和 127.0.0.1 工作,需要在主机文件中进行 dns 解析。如果不是,它将无法正常工作。

另一方面,0.0.0.0 在所有地址范围内都可用,并且可以从 dhcp 服务器提供给它的主机的地址范围中进行侦听。它不需要 dns 解析。

我不知道这是否是答案,但是当我在 0.0.0.0 上进行通信时,它在 Win 和 MacOS 上都可以工作。

【讨论】:

以上是关于交叉编译的 c# 套接字程序,适用于 win,但不适用于 mac的主要内容,如果未能解决你的问题,请参考以下文章

交叉编译适用于 iOS 的 Jansson C 库

.net 4.7.1 C# OCX 事件处理程序适用于 win10x 86/64,不适用于 win7/8 x86/64

适用于 iOS 的 leptonica 1.69 交叉编译(armv7、armv7s 和 arm64)

我在 Angular 中使用动态编译器,但它只适用于视图引擎,但不推荐使用视图引擎

QtCreator 从 Win 交叉编译 Raspberry Pi,发出远程运行应用程序

Qt - 在 Windows 上为 Linux 交叉编译