C#.Net.Sockets Onreceive部分有效

时间:2018-06-09 17:14:35

标签: c#

我正在尝试将我在Unity中使用的C#源转换为Visual Studio Windows窗体应用程序,但我无法弄清楚为什么我的onreceive部分无法工作。

我正在做的是与服务器建立TCP连接(正常),然后我的服务器发送一个我收到但无法处理的欢迎包。

有时它会完全运行,但不会触发触发器(稍后解释)。

由于源最初来自一个统一项目,我可以等待更新,我认为这就是它在那里工作的原因。

代码:

private void OnReceive(IAsyncResult ar)
    {
        try
        {
            int byteAmt = myStream.EndRead(ar);
            byte[] myBytes = new byte[byteAmt];
            Buffer.BlockCopy(asyncBuff, 0, myBytes, 0, byteAmt);
            if (byteAmt == 0) return;

            //UnityThread.executeInUpdate(() =>
            //{
            ClientHandleData.HandleData(myBytes);
            //});

            myStream.BeginRead(asyncBuff, 0, 8192, OnReceive, null);
        }
        catch
        {
            Console.WriteLine("we have an error in onreceive");
        }
    }

Handledata

public static void HandleData(byte[] data)
    {
        byte[] Buffer;
        Buffer = (byte[])data.Clone();

        if (playerBuffer == null) playerBuffer = new ByteBuffer();
        playerBuffer.WriteBytes(Buffer);

        if (playerBuffer.Count() == 0)
        {
            playerBuffer.Clear();
            return;
        }

        if (playerBuffer.Length() >= 8)
        {
            pLength = playerBuffer.ReadLong(false);
            if (pLength <= 0)
            {
                playerBuffer.Clear();
                return;
            }
        }

        if (playerBuffer.Length() >= 8)
        {
            pLength = playerBuffer.ReadLong(false);
            if (pLength <= 0)
            {
                playerBuffer.Clear();
                return;
            }
        }

        while (pLength > 0 & pLength <= playerBuffer.Length() - 8)
        {
            if (pLength <= playerBuffer.Length() - 8)
            {
                playerBuffer.ReadLong();
                data = playerBuffer.ReadBytes((int)pLength);
                HandleDataPackets(data);
            }
            pLength = 0;

            if (playerBuffer.Length() >= 8)
            {
                pLength = playerBuffer.ReadLong(false);
                if (pLength < 0)
                {
                    playerBuffer.Clear();
                    return;
                }
            }
        }
    }

并持续使用HandleDataPackets

public static void HandleDataPackets(byte[] data)
    {
        long packetnum; ByteBuffer buffer; Packet_ packet;
        buffer = new ByteBuffer();
        buffer.WriteBytes(data);
        packetnum = buffer.ReadLong();
        buffer = null;

        Form1.label1.Text = "reading packetnum";
        if (packetnum == 0) return;

        Form1.label1.Text = "packetnum read and is not 0";

        if (packets.TryGetValue(packetnum, out packet))
        {
            Form1.label1.Text = "trigger";
            packet.Invoke(data);
        }
    }

有时它一直运行到Form1.label1.Text =&#34; packetnum read并且不是0&#34 ;;在HandleDataPacket中行,但它不会触发触发行:(。

有人可以告诉我为什么会这样吗?

1 个答案:

答案 0 :(得分:0)

好的,我发现了问题。 我试图以统一的方式初始化包,但不得不从程序本身触发它。

我创建了一个Networkmanager类,初始化不同的包,然后建立连接。这固定了!

上面的所有代码都按预期工作。

刚才意识到约翰正在告诉我这个! 糟透了我几个小时前没有看到。 将其作为答案发布,并将其标记为一个。