当前位置:编程学习 > C#/ASP.NET >>

Socket.BeginReceive循环读取到重复数据包!!!

我的客户端程序连接服务器后,需要不停的接收服务端反馈的消息命令,以下是异步消息读取函数:
        public void ReceiveDatagram()
        {
            try
            {
                StateObject so = new StateObject();
                so.Client = SessionSocket;
                SessionSocket.BeginReceive(so.RevaceBuf, 0, StateObject.BufferSize, SocketFlags.None, new AsyncCallback(ReceiveCallback), so);
            }
            catch(Exception ex)
            {
                OnSessionReceiveException(ex, new FileTransEventArgs(this));
            }
        }

以下是回调函数:
private void ReceiveCallback(IAsyncResult ar)
        {
            lock (this)
            {
                FileTransEventArgs args = new FileTransEventArgs(this);
                StateObject so = (StateObject)ar.AsyncState;
                Socket handler = so.Client;
                try
                {
                    int sendLegth = handler.EndReceive(ar);
                    if (sendLegth > 0)
                    {
             
                        Response responsePacket = new Response();
                        responsePacket = (Response)PacketConsts.BytesToStuct(so.RevaceBuf, typeof(Response), 0, Marshal.SizeOf(responsePacket));
                        switch (responsePacket.Command)
                        {
                            case PacketConsts.FILE_RECEIVER: //数据包确认                                PacketIndex++;
                                SendDatagram();
                                break;
                            case PacketConsts.PAUSE_PFILE://文件传输暂停
                                break;
                            case PacketConsts.FILE_FININSHED://文件传输完成
                                OnFileTransFinished(null, args);
                                break;
                            case PacketConsts.CONVERT_PROCESS://文件转换进度
                                ConvertPriorTime = DateTime.Now;
                                OnBeginConvertFile(null, args);
                                break;
                            case PacketConsts.FILE_BASECONFIRM://传输文件基本信息
                                this.State = TransState.Loading;
                                SendDatagram();
                                break;
                            case PacketConsts.FILETRANS_REPEAT://数据包重传
                                PacketIndex = (int)responsePacket.Code;
                                SendDatagram();
                                break;
                            case PacketConsts.FILETRAN_CONTINUE://文件续传
                                this.State = TransState.Loading;
                                break;
                            default:
                                break;
                        }
                        StateObject reviceBuff = new StateObject();
                        reviceBuff.Client = handler;
                        handler.BeginReceive(reviceBuff.RevaceBuf, 0, StateObject.BufferSize, SocketFlags.None, new AsyncCallback(this.ReceiveCallback), reviceBuff);
                    }
                }
                catch (SocketException ex)
                {
                }
当我接收到文件数据包重传命令时,处理完重传命令后,继续接收,如果公网环境下的话,网络情况不好的时候,客户端会继续接收到数据包重传命令,这是怎么回事,请大家帮忙看看,谢了先! --------------------编程问答-------------------- 你怎么去判断一条指令发送后,客户端接收完全?
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,