【问题标题】:C# (Unity) Socket receives data overwrite?C#(Unity)Socket接收数据覆盖?
【发布时间】:2015-09-29 17:51:46
【问题描述】:

演示

https://github.com/mingchaoyan/chat

如果将 BroadcastClient.cs 中的 SendMsg 更改为

void Send1(string inputString1) {
    Proto.BroadcastProto proto = new Proto.BroadcastProto();
    proto.userName = "Client";
    proto.stringMsg =inputString1;

    NetPacket p = new NetPacket();
    p.BeginWrite("OnRevMsg");
    p.WriteObject<Proto.BroadcastProto>(proto);
    p.EncodeHeader();

    networkManager.Send(p);
    inputString = "";
}

void SendMsg() {
    Send1 ("1");
    Send1 ("22");
    Send1 ("333");
    Send1 ("4444");
    Send1 ("55555");
    Send1 ("666666");
    Send1 ("7777777");
    Send1 ("88888888");

}

是的,一次发送多个消息,而不是像以前那样发送一个接收一个。

然后你会发现OnRevMsg中的Debug.log几乎打印出来了

"88888888"

8 次。

我调试socket发现NetworkManager.packets的元素(这是一个队列)每次收到新的msg时都会改变为新收到的!

我从套接字接收数据有什么问题吗?

【问题讨论】:

  • BeginWrite 是否有匹配的 EndWrite?
  • @RonBeyer 不,我认为这就足够了

标签: c# sockets unity3d


【解决方案1】:

我终于找到了错误。

NetworkManager.cs,Buffer 应该是 CopyTo 一个新的 NetPacket 以避免卷影复制。

public void AddPacket( NetPacket packet ) {
        lock (packets) {
            NetPacket p = new NetPacket();
            packet.bytes.CopyTo(p.bytes,0);
            p.bodyLength = packet.bodyLength;
            packets.Enqueue(p);
        }
    }

所以我删除了演示。

【讨论】:

    猜你喜欢
    • 2011-05-30
    • 1970-01-01
    • 1970-01-01
    • 2015-07-31
    • 2012-11-08
    • 2018-09-17
    • 2020-01-09
    • 2013-01-03
    • 1970-01-01
    相关资源
    最近更新 更多