日期:2014-05-17  浏览次数:20840 次

类似802.3帧通过TcpClient透明传输收发处理,求请一种高效的分段方法
数据帧格式:
AA AA AA AA AA AA AA AB ...... 0400 AABBCCDD0108...+CRC32+AA AA AA AA AA AA AA AC…………
前导+SFD(8字节)+交换地址(32字节)+帧长度(4字节)+数据单元+(crc32 4字节校验)+结尾介定
需求:
从下位机收到这些数据帧==tcp==>中心服务器(A)处理==tcp==>多个远程服务器(禁止作任何处理)==tcp/udp==>其局域网内下位机(或数据服务器)采集控制

由于中心服务器收到的数据量比较大而且很频繁,我目前用的是LINQ感觉效率很低,可能是我的算法太差,请求各位高手有什么高效率TCP分包方法应用在中心服务器中吗?

------解决方案--------------------
前导+SFD(8字节)+交换地址(32字节)+帧长度(4字节)+数据单元+(crc32 4字节校验)+结尾介定
前导和结尾介定的长度是多少?

就按你们定好的协议读取就行了,不需要分包,大概是这样:
            byte[] b1 = new byte[前导长度 + 8 + 32];
            socket.Receive(b1, b1.Length, SocketFlags.None);

            byte[] b2 = new byte[4];
            socket.Receive(b2, b2.Length, SocketFlags.None);
            int len = BitConverter.ToInt32(b2, 0);

            byte[] b3 = new byte[len];
            socket.Receive(b3, b3.Length, SocketFlags.None);

            // 继续读后面的内容


------解决方案--------------------
服务器端程序用ling本身就脑残。。。
保证当前接收数据的线程不参与业务方面的操作就可以了。你可以用以使用3.5框架提供的那个socket特性(SocketAsyncEventArgs)来处理。那个就是为大数据并发而增加的。