首页 新闻 会员 周边 捐助

C# UDP 大数据的分段发送与接收

0
悬赏园豆:100 [待解决问题]

求:UDP 大数据的分段发送与接收,用C#写的源码

growj的主页 growj | 初学一级 | 园豆:112
提问于:2012-12-14 14:58
< >
分享
所有回答(5)
0

udp不是数据报。记得是不分段的吧。

angelshelter | 园豆:9914 (大侠五级) | 2012-12-14 17:51
0

已经解决问题

growj | 园豆:112 (初学一级) | 2012-12-15 14:42

你好,代码能不能分享一下,我刚学这个

支持(0) 反对(0) 小魔女123 | 园豆:200 (初学一级) | 2016-03-28 16:50
0

发段保存到数据库不行吧

toEverybody | 园豆:257 (菜鸟二级) | 2012-12-16 15:21
0

很简单,把具体的应用场景说一下。

Firen | 园豆:5385 (大侠五级) | 2012-12-18 16:41
0

分多个包发送:

View Code
        private byte[] InsertStartAndEndMark(MsgType msgType, byte[] source)
        {
            byte[] result = new byte[source.Length + 1];
            result[0] = (byte)msgType;
            Array.Copy(source, 0, result, 1, source.Length);
         
            return result;
        
        }


        public void SendMsg(byte[] data)
        {
            SendMsg(data, MsgType.Image);
        }

        public void SendMsg(byte[] data, MsgType msgType)
        {
            try
            {
                //byte[] newData = InsertStartAndEndMark(msgType, data);
                int offSet = 0;
                do
                {
                    byte[] tempData = new byte[(data.Length - offSet) > 60000 ? 60000 : (data.Length - offSet)];
                    Array.Copy(data, offSet, tempData, 0, tempData.Length);

                    // 加标签
                    byte[] newData = InsertStartAndEndMark(msgType, tempData);

                    offSet += tempData.Length;

                    sock.SendTo(newData, iep1);
                } while (data.Length > offSet);
            }
            catch (Exception ex)
            {
                string s = "";
            }
        }

接收要建立一个临时的List存放未完的数据:

View Code
   public void Record()
        {
            Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            IPEndPoint iep = new IPEndPoint(IPAddress.Any, Port);
            sock.Bind(iep);
            EndPoint ep = (EndPoint)iep;
            Encoding gb2312 = Encoding.GetEncoding("gb2312");
            string lastMsg = string.Empty;
            List<byte[]> tempDataList = new List<byte[]>();
            while (!isDispose)
            {
                byte[] source = new byte[1024 * 61];
                try
                {
                    int recv = sock.ReceiveFrom(source, ref ep);

                    MsgType msgType = (MsgType)source[0];
                    byte[] data = new byte[recv - 1];
                    Array.Copy(source, 1, data, 0, recv - 1);
                    // 是否分多个包
                    if (recv >= 60001)
                    {
                        tempDataList.Add(data);
                        continue;
                    }

                    int totalSize = (recv - 1) + (tempDataList.Count == 0 ? 0 : tempDataList.Sum(v => v.Length));
                    byte[] newData = new byte[totalSize];
                    int offSet = 0;
                    foreach (byte[] tempByte in tempDataList)
                    {
                        Array.Copy(tempByte, 0, newData, offSet, tempByte.Length);
                        offSet += tempByte.Length;
                    }
                    tempDataList.Clear();
                    // 加上本次接收的数据
                    Array.Copy(data, 0, newData, offSet, data.Length);

                    switch (msgType)
                    {
                        case MsgType.Text:
                            string stringData = Encoding.Default.GetString(newData, 0, recv - 1);
                            stringData = crypto.Decrypt(stringData);

                            if (RecordMsgEvent != null)
                                RecordMsgEvent(stringData);
                            break;
                        case MsgType.Image:
                            if (RecordImageEvent != null)
                                RecordImageEvent(newData);
                            break;
                        default:
                            break;
                    }

                }
                catch
                {
                }
            }
           
            sock.Close();
        }

MsgType 这是一个枚举、这代码一次发送和接收60000个字节,如果接收完则触发事件,这里面有两个事件,一个是接收到消息,还有一个是接收到图片,你改进下就行了,我这是自己写的一个UDP聊天程序的代码

youwj | 园豆:30 (初学一级) | 2012-12-18 17:13
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册