在n个主机(N1,N2......Nn)上使用继承至CSocket的Socket侦听,在主机M上建立n个继承至ASyncSocket的ClientSocket和这n个主机建立连接,建链成功后,Socket之间用20的定时互发心跳消息。
问题:
以1000秒为单位统计M和N1,N2...Nn上的心跳包发现这样的问题:在M上每个1000秒都能正常的受到50个由N1,到Nn发来的心跳包,但在在N1到Nn上统计的包却不正常,有的1000秒收到40个来之M的心跳包,有的1000秒却收到60个来至M的心跳包,不稳定。出现这个问题导致我做链路检测不好实现,不知道多长时间收不到包就表示链路出问题,在我原来的程序中我以6次收不到心跳包表示链路断,经常有6×20秒一个包都收不到的时候。
M和这n个主机没有丢包,长时间ping2000个Byte的包也很正常。我在M上创建的Soclet设置成立即发送模式,故障现象依旧。
请dx看一下是什么问题导致N1到Nn收包有这样的问题???
谢谢了先!!!

解决方案 »

  1.   

    UDP还是TCP?TCP就不用心跳了吧,UDP丢点包也是很正常的。
      

  2.   

    TCP的,没有心跳的话服务器断过一定时间收不到包会认为Socket不可用的。主要不是心跳的问题,我的问题是为什么会在N1...Nn上收包会有这样的问题
      

  3.   

    谢谢你们的回复。M没有发送失败,因为我在Send和OnSend都加了打印,没有出错消息,发送心跳的方法是使用MFC的timer定时器,定时器的OnTimmer被Call的时候调用Socket的链路检测方法,这个方法就是发一个固定消息给N。
      

  4.   

    明白了,那么你需要查看Nx的记数部分,是否存在一次收到多个M发来的心跳包的情形,因为你的心跳发送时间间隔比较小.你的心跳包最好是带了自校验字节的数据结构,在接收心跳的时候不要理所当然的认为所接收的一包数据就是一个心跳报文
      

  5.   

    还有一种可能,能不能是你发送时选择套接字对象时出现了错误,也就是说要发给N1本来应该使用 NS1 套接字对象,但你却用其它的套接字对象发了? 你把所有 N 接收到的心跳加起来看看总数是不是对的? 如果是对的就有可能是发送时选错了套接字对象!
      

  6.   

    M上似乎应该使用多线程,每个线程对应一个N,不要用定时器,你的问题我估计是CPU忙不过来出错了,定时器会有排队的问题,windows又是抢先式的多任务系统,这样有可能出现你的这个问题
      

  7.   

    to ProgrameMan:
    这个可能性不大,因为我是这样实现的:ServerSocket的Accept被调用的时候创建继承自ASyncSocket的ClinetSocket与M的Socket通讯,而检测链路的方法是ClinetSocket的成员方法,
    代码:
    void ServerSocket::TestClientLink()
    {
    BOOL result=0;
        ClientSocket * pClientSocket = NULL;
        POSITION pos,temp;
      
        for(pos = m_ClientList.GetHeadPosition(); pos != NULL;)
    {
    temp = pos;
    pClientSocket = (ClientSocket *)m_ClientList.GetNext(pos);
    if (pClientSocket->m_close)
    {
        m_ClientList.RemoveAt(temp);
        delete pClientSocket;
    }
    else
    {
    pClientSocket->TestLink();
    }
    }
    }to 白云:
    有可能,我加一下M的调用Send的打印统计,顺便抓一下M的包看一下。to all:
    Thanks a lot, Happy new year!!
      

  8.   

    to alfwolf:
    我有命令码的,收到的消息里的命令码是心跳命令才统计!!