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#