【问题标题】:TCP IP socket.receive, data received in .Net application but not in UnityTCP IP socket.receive,在 .Net 应用程序中接收到的数据,但在 Unity 中没有
【发布时间】:2018-08-17 11:44:33
【问题描述】:

我通过 TCP 从 .NET 应用程序向 Unity 发送数据,但未收到所有字节。使用相同代码的简单 .NET wpf 应用程序就是这种情况。为什么Unity有区别?两者都基于 .NET 4.7?

// Data send from .NET application: 
byte[] ba = memoryStream.ToArray();
var buffer = BitConverter.GetBytes(ba.Length);
stm.Write(buffer, 0, buffer.Length);
stm.Write(ba, 0, ba.Length);

// Data receive works in .NET but in Unity not all bytes are received
Socket s;
byte[] buffersizeinbytes = new byte[32];
TcpListener myList = new TcpListener(ipAd, 8001);
s = myList.AcceptSocket();
(...)
int k = s.Receive(buffersizeinbytes);
int size = BitConverter.ToInt32(lengthb, 0); // size of buffer
byte[] buffer = new byte[size]; 
int receivedByteCount = s.Receive(buffer);

【问题讨论】:

  • 请在您的代码中添加更多上下文,例如,我不知道s.Receive() 中的s 是什么。
  • k的值是多少?请记住,不能保证 Receive 一次性接收所有发送的字节。我没有看到您接收部分内容的帐户。
  • receivedByteCount 不等于 buffer.length 的长度(缓冲区大小)。但它在.NET 中。我的问题更多是关于 c# 和统一处理 TCP 之间的区别。
  • 如前所述,不能保证调用 Receive 会真正为您获取所有内容。在此之前,您将获得任何可用的东西,最大为您指定的大小。返回的值是您获得了多少内容。如果您知道发送的数据的大小,请调用 Receive 直到您获得所有内容。

标签: c# .net unity3d tcp


【解决方案1】:

虽然您的代码在一个应用程序中工作,但在 Unity 中不工作,这似乎令人困惑,但这不是您问题的核心。您似乎在假设,当您发送大块数据时,您也会以这种方式接收它们。事实并非如此。

致电Receive 将导致您获得一些数据,最多可达到您要求的数量,但您可能无法获得全部数据。返回值将准确地告诉您实际得到了多少。如果您期望更多,您将不得不再次致电Receive,直到您获得所有您期望的数据。

Receive 有多种重载,允许您指定缓冲区的偏移量。因此,如果您期望 32 个字节的数据,但您只得到 16 个字节,您可以使用相同的缓冲区再次调用 Receive,但指定一个偏移量,以便您的缓冲区将从第一个空条目开始填充。

所以并不是 Unity 做了什么奇怪的事情,而是你很幸运在你的其他应用程序中所有的工作都没有问题。

【讨论】:

    猜你喜欢
    • 2011-05-25
    • 1970-01-01
    • 2012-09-14
    • 2022-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多