还是使用timer吧.
定义一个全局量:count用来计算重发次数.
定义一个全局量:Flag用来表未是否有确认信息返回private sub timer1_timer()
      if flag then
           timer1.enabled=false
      else
           count=count+1
           if count=最大重试次数 then
                 msgbox "连接失败!"
                 flag=flase
                 timer1.enabled=false
                 exit sub
           endif
           '这里重发请求
      end if
end sub如果接收到确认信息
  flag=true点击连接事件:
count=1
timer1.enabled=true

解决方案 »

  1.   

    说实话,udp编程其实很复杂的,如果觉得tcp完全能实现你的功能的话,最好用tcp,
    而upd 的难度,我觉得就是要写一个判断客户端接受的情况的,如果这里搞定了,实现起来就容易多了,我也曾经和搂主遇到过相同的问题,最后还是选择了tcp,
    强烈的关注这个问题,希望高人多多指教!顶!
      

  2.   

    建立一个结构,结构内有count和下一次要检查的时间
    实际上你使用VC编写一个低端的DLL然后使用C#调用一下较好。
    我以前在VC6的写法是
    LONG UserTime;
    UserTime = gettickcount() + 你定义的时间间隔;
    然后在消息环加入
    LRESULT CALLBACK ServerWinProc(HWND hWnd, UINT nMessage, WPARAM wParam, LPARAM lParam)
    {
    if(hWnd)
    {
    while(1)
    {
    if( PeekMessage(&msg, NULL, 0, 0, PM_REMOVE) )
    {
    if( msg.message == WM_QUIT )
    {
    break;
    }
    else
    {
    lCount = 0;
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    }
    }
    else
    {
    OnIdle(lCount);
    lCount ++;
    }
    }
    }     
    }
    这段代码主要是当消息环一有闲暇的时间就处理时间比较。比较快速。(效率较高)
    看看能不能组成C#代码。
      

  3.   

    把你的判断时间代码写在OnIdle(lCount)函数中。
      

  4.   

    现在考虑用队列来实现,可以在vb 做一个指针队列,然后用一个timer控件来触发比较事件,不知道这样的效率怎么样啊!
      

  5.   

    能否使用列队式处理。因为超时控制要求的时间精读非常低,可以建立一个队列,进行一次连接尝试就在队列的最后添加连接时间。(用一定间隔的定时器或者Idle事件都可以)进行间隙性检查,如果队列的最前方元素超时,就移除,并检查后一项(注意:这里需要很好的优化,否则处理太慢,而且可能过忙sj)。断开连接等操作最好是用新的线程以免阻滞。
      

  6.   

    to pigpag(噼里啪啦)能不能说的详细点啊,关于线程方面的,或者给个例子啊,因为在服务器端处理的不是一个失败重传,所以我想用一个指针队列,每发送一个指令,就在队列里面加一条记录,然后用timer控件来触发,每触发一次,记录里的时间都加1 ,如果有的记录里的时间超时,就把他从指针队列里面删除,如果返回了确认信息,也把该记录从指针队列里面删除。不知道这样可不可以。你说的线程处理,是如何实现啊?望告之,不胜感激!!!!
      

  7.   

    客户端的定时回发机制非常重要,客户的回发消息使相关的指针下沉到队列的尾部,这样我们只需要一个另外的线程来处理队列的顶部指针旧可以了,也就是判断顶部指真的上一次回发时间和now的时间差,而且这个线程可以是级别很低的,(这个线程也可以用Idle事件)
      

  8.   

    大概的流程:
    建立一个列队,元素的结构如下:DateTime 时间 //用来记录连接开始时间
    int 剩余重试次数 //用来记录剩余重试次数用空闲事件对列队顶端的元素进行检验,如果当前时间-时间>TimeOut,就创建一个控制重试的线程(为的是重试和列队检查同步进行,以免线程阻滞),注意传递剩余的重试次数。只要在重试线程中放置添加队列元素的程序段即可。OnIdle只需管处理列队元素。:-\我总觉得讲不清楚……
      

  9.   

    to xiaha3(夏)
    不知道大虾有没有看我的问题,我不太明白你说的,好象和我说的问题不是一回事啊。to piapag(噼里啪啦)
    大虾所说的数据结构我已经知道了,我想问你所说的,哪个控制重试的线程怎么实现啊,而且vb 里面对于线程也不太好实现啊,大虾能不能给个例子,或者结合例子说一下啊!
      

  10.   

    to xiaha3(夏)
    不知道大虾有没有看我的问题,我不太明白你说的,好象和我说的问题不是一回事啊。to piapag(噼里啪啦)
    大虾所说的数据结构我已经知道了,我想问你所说的,哪个控制重试的线程怎么实现啊,而且vb 里面对于线程也不太好实现啊,大虾能不能给个例子,或者结合例子说一下啊!
      

  11.   

    用类封装:
    创建一个类,成员如下:Thread 线程 = new Thread( //指向内部实现函数 );
    int 剩余重试次数;
    string 对方地址;然后放方法:public void Retry(){    //启动线程    }线程所指向的实现函数放在类的内部作为私有函数,这样一个类的实例就能包含一个不受干涉的线程。你做要在OnIdle加入的内容可能就是这样的类 newInstance = new 类();
    newInstance.剩余重试次数 = 队列元素.剩余重试次数;
    newInstance.对方地址 = 队列元素.对方地址; (不好意思,刚刚的数据结构中少了)
    newInstance.Retry();大概就是这样。在线程完成一个连接尝试后注意要自身销毁一下。
      

  12.   

    还有,你到底在用VB6还是.net?……