【发布时间】: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)。 -
感谢您的回答,但代码甚至无法发送任何内容。我把所有的通讯代码都删了,只试了连接,还是不行。