交叉编译的 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的主要内容,如果未能解决你的问题,请参考以下文章
.net 4.7.1 C# OCX 事件处理程序适用于 win10x 86/64,不适用于 win7/8 x86/64
适用于 iOS 的 leptonica 1.69 交叉编译(armv7、armv7s 和 arm64)
我在 Angular 中使用动态编译器,但它只适用于视图引擎,但不推荐使用视图引擎