Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 合并套接字中拆分的字节以供进一步使用?_C#_Winforms_.net 4.0 - Fatal编程技术网

C# 合并套接字中拆分的字节以供进一步使用?

C# 合并套接字中拆分的字节以供进一步使用?,c#,winforms,.net-4.0,C#,Winforms,.net 4.0,我有一个TCP套接字应用程序,其中我必须读取几种类型的回复,它们的最大大小为缓冲区8192。一些回复被拆分为更多的数据包 目前,我在回复44中收到了一个成员列表,因此我必须能够处理拆分的数据包的第一个想法是定义一个流输出端来存储传入数据,直到它使用bool和current size变量完成 一旦点击reply 44,它将检查extraList是否为true或false,如果为false,则表示它是对传入成员列表的初始请求 如果数据包的4个初始字节大于bytes.Legth,即8192,它将触发e

我有一个TCP套接字应用程序,其中我必须读取几种类型的回复,它们的最大大小为缓冲区8192。一些回复被拆分为更多的数据包

目前,我在回复44中收到了一个成员列表,因此我必须能够处理拆分的数据包的第一个想法是定义一个流输出端来存储传入数据,直到它使用bool和current size变量完成

一旦点击reply 44,它将检查extraList是否为true或false,如果为false,则表示它是对传入成员列表的初始请求

如果数据包的4个初始字节大于bytes.Legth,即8192,它将触发extraList为true,并将初始数据填充到我之前设置的缓冲区中,使数据包的总大小保持不变

由于extraList已被触发并变为true,因此数据包读取将落入其中,直到数据完成,然后将其设置回false,并使用完整列表触发MemberList函数

希望得到一些建议、建议等,以改进此代码

int storedCurSize = 0;
MemoryStream stored = null;
bool extraList = false;

while (roomSocket.Connected)
{
    byte[] bytes = new byte[roomSocket.ReceiveBufferSize];
    roomSocket.Receive(bytes);

    MemoryStream bufferReceived = new MemoryStream(bytes, 0, bytes.Length);
    using (var reader = new BinaryReader(bufferReceived))
    {
        int packetSize = (int)reader.ReadInt32() + 9;
        int reply = (int)reader.ReadByte();
        if (reply == 44 || extraList)
        {
            if (!extraList && packetSize <= bytes.Length)
            {
                MemberList(bytes);
            }
            else
            {
                if (!extraList)
                {
                    stored = new MemoryStream(new byte[packetSize], 0, packetSize);
                    stored.Write(bytes, 0, bytes.Length);
                    storedCurSize = bytes.Length;
                    extraList = true;
                }
                else
                {
                    if (storedCurSize < stored.Length)
                    {
                        int storedLeftSize = (int)stored.Length - storedCurSize;
                        stored.Write(bytes, 0, (storedLeftSzie < bytes.Length) ? storedLeftSize : bytes.Length);
                        storedCurSize += (storedLeftSize < bytes.Length) ? storedLeftSize : bytes.Length;
                        if (storedCurSize >= stored.Length)
                        {
                            extraList = false;
                            MemberList(stored.ToArray());
                            stored.Close();
                        }
                    }
                }
            }
        }
    }
}
int-storedCurSize=0;
存储的MemoryStream=null;
bool extraList=false;
while(roomSocket.Connected)
{
字节[]字节=新字节[roomSocket.ReceiveBufferSize];
roomSocket.Receive(字节);
MemoryStream bufferReceived=新的MemoryStream(字节,0,字节.长度);
使用(变量读取器=新二进制读取器(bufferReceived))
{
int packetSize=(int)reader.ReadInt32()+9;
int reply=(int)reader.ReadByte();
如果(回复==44 | |额外列表)
{
如果(!extraList&&packetSize=stored.Length)
{
extraList=false;
成员列表(存储在.ToArray()中);
存储。关闭();
}
}
}
}
}
}
}

在简要阅读代码时,闪烁的是神奇的数字(9,44)和非常深的嵌套。 用命名良好的常量替换数字,并将代码的某些部分作为方法移出

如果它们被使用的局部变量紧紧地扭曲了——可能所有这些方法都值得转移到工作者类中,只承担一项责任——来读取消息。这样,局部变量就变成了类字段,而方法对于重构来说就不会那么死板了


另外,MemberList(…)对于一个方法来说是个糟糕的名字,对我来说也是。将其设置为描述方法所做操作的动词。

要合并不在一起的字节,可以使用Buffer.BlockCopy()


使用memorystream是坏还是慢?@Prix,使用memorystream不是“坏”,只是慢一点。如果性能对你来说不是问题,那么如果你对MemoryStream更满意,那就千方百计去做吧!我是从我的原始代码中匆忙完成这项工作的,我主要是在寻找关于这个问题的建议和建议,一旦我认为我目前使用的方法是可以接受的,或者可以从它必须完成的任务中改进它,我将处理剩下的问题,原始代码将其划分为类中的块,在类中我对收到的每种类型的消息等进行枚举,而且命名方案也有很大的不同,在我的语言中,我尽力将其全部转换为英语,以便让阅读者更容易理解。希望你能理解…好吧,比这还好。我没有看到任何使代码在性能方面变得更好的可能性,所以我的回答只提到可读性问题。这也是代码改进,顺便说一句:)
byte[] buf1;
byte[] buf2;
byte[] concatenated = new byte[buf1.Length + buf2.Length];

Buffer.BlockCopy(buf1, 0, concatenated, 0, buf1.Length);
Buffer.BlockCopy(buf2, 0, concatenated, buf1.ength, buf2.Length);