C#(Unity)Socket接收数据覆盖?

时间:2015-09-29 02:24:29

标签: c# sockets unity3d

演示

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次。

我发现套接字发现NetworkManager.packets(这是一个队列)的元素每次收到新的msg时都会更改为新接收的内容!

我是否在从套接字接收数据时出错了?

1 个答案:

答案 0 :(得分:0)

我终于找到了这个bug。

NetworkManager.cs,Buffer应该复制到新的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);
        }
    }

所以我删除了演示。