我用winfrom做了一个与硬件通信的服务器,但发现会丢失硬件发过来的数据包,请教如何解决数据包丢失的问题。??分不多,请大家帮忙看看,谢谢!
/// <summary>
/// 取心跳包
/// </summary>
/// <param name="time"></param>
/// <param name="index"></param>
/// <param name="buf"></param>
/// <param name="length"></param>
/// <returns>return the length of buf 0 no packet, -1 not start, -2 packet length > length;</returns>
[DllImport("Iocp_dll.dll", EntryPoint = "_GetHeartBeatPacket@16", CharSet = CharSet.Auto)]
public static extern int GetHeartBeatPacket(ref uint time, ref int index, byte[] buf, int length); public void GetHeartPacket()
{
uint heartTime = 0;
int heartIndex = -1;
byte[] heartbuffer = new byte[10];//接收包缓冲区
int heart = -1;//心跳包的返回值 while (true)
{
heart = Iocp_Dll.GetHeartBeatPacket(ref heartTime, ref heartIndex,heartbuffer,heartbuffer.Length);
if ((heart != 0) && (heart != -1) && (heart != -2))
{
ushort cmd = 0x00A0;
SendCmdPacket.SendPacket(heartTime, heartIndex, cmd);//表示控制器当前的与上位机通信正常
DcuCacheInfo cache = DcuCacheManager.GetDucCacheMessageByTime(heartTime, heartIndex);
if (cache != null)//保存数据
{
cache.OnlineTime = DateTime.Now;
DcuCacheManager.ModifDcuCacheMessageByTime(cache);
}
} ExitCmd();
GC.Collect();
Thread.Sleep(360);
}
}
/// <summary>
/// 取心跳包
/// </summary>
/// <param name="time"></param>
/// <param name="index"></param>
/// <param name="buf"></param>
/// <param name="length"></param>
/// <returns>return the length of buf 0 no packet, -1 not start, -2 packet length > length;</returns>
[DllImport("Iocp_dll.dll", EntryPoint = "_GetHeartBeatPacket@16", CharSet = CharSet.Auto)]
public static extern int GetHeartBeatPacket(ref uint time, ref int index, byte[] buf, int length); public void GetHeartPacket()
{
uint heartTime = 0;
int heartIndex = -1;
byte[] heartbuffer = new byte[10];//接收包缓冲区
int heart = -1;//心跳包的返回值 while (true)
{
heart = Iocp_Dll.GetHeartBeatPacket(ref heartTime, ref heartIndex,heartbuffer,heartbuffer.Length);
if ((heart != 0) && (heart != -1) && (heart != -2))
{
ushort cmd = 0x00A0;
SendCmdPacket.SendPacket(heartTime, heartIndex, cmd);//表示控制器当前的与上位机通信正常
DcuCacheInfo cache = DcuCacheManager.GetDucCacheMessageByTime(heartTime, heartIndex);
if (cache != null)//保存数据
{
cache.OnlineTime = DateTime.Now;
DcuCacheManager.ModifDcuCacheMessageByTime(cache);
}
} ExitCmd();
GC.Collect();
Thread.Sleep(360);
}
}
每次接收到的不会超过10个字节?