我的UDP套接字可能有上百个,如何使用很少的线程就可以对套接字能有效管理?
如果能解决问题,再开两个帖子给200分。

解决方案 »

  1.   

    IO完成端口模型,或者你只开一个线程,使用evenselect模型也是可以的,不管你有多少个套接字
      

  2.   

    开口闭口就是完成端口,几百个连接用select就能工作得挺好,不过不管是哪个模型也不能具备你所说的udt超时重发机制,这个是要自已写的.要么干脆就用tcp
      

  3.   

    超时重发我已经决定了字节写。
    EVENTSELECT模型一个线程最多支持64个套接字,这个限制会导致需要开辟很多线程。
    UDP在EVENTSELECT模型中可以很好工作,但是在完成端口中没有反应,是不是不支持啊?
      

  4.   

    The variable FD_SETSIZE determines the maximum number of descriptors in a set. (The default value of FD_SETSIZE is 64, which can be modified by defining FD_SETSIZE to another value before including Winsock2.h.)
      

  5.   

    UDP的没有重传机制,只能由应用层来解决如果数据交换不是非常频繁的话
    使用事件选择或是select模型即可满足你的要求
      

  6.   

    不是不支持,我实现了事件模型,也实现了完成端口模型的封装,发现它和事件模型没什么区别,因为是数据报。所以发送的数据可以全部收到。你可以在发送端写一个缓冲区,如下
    while(Buffer.getLength() >= 0)
      if(nret = sendto(socket,Buffer.read,....);
      Buffer.remove(nret);
    }
    注意:UDP你不能确认是否接收到数据。所以也就没有超时重发的问题
      

  7.   

    leon7909(leon) 你大爷。
    老子在后面不是说过了可以只开一个evenselect模型也是可以满足要求的吗。
    你说几百个,我信吗!!!
    如果同时发送超过8。5k的数据,接收端就会出现问题。
    这时就要使用完成端口模型。你他妈知道吗?我自己逐个试的。
      

  8.   

    更确切的说要想实现超时重发只有在缓冲区中来写了
    while(Buffer.getLength() >= 0)
      if(nret = sendto(socket,Buffer.read,....);
    {
        if(GetLastError() == WSAEWOULDBLOCK) 
          {
    TRACE("Blocking\n");
    Sleep(100);
    break;
          }
        else
          Buffer.remove(nret);
    }
      

  9.   

    刚才写了很多,提交时server unavailable.经常这样,我看CSDN的服务器支撑不下去。 ddgfei(不懂规矩) :
    你说的那种方法恐怕不行。
    你这样只是保证发送出去,是否送到是不确定的。对方能否返回给你也是不确定的。所以我对每个套接字保存了一个发送缓冲区,时间戳,发送序列号和请求序列号,这样可以解决问题。
    仿照的是TCP的实现。
      

  10.   

    什么意思?
    发送缓冲区肯定要有,UDP本来就是不可靠的传输协议。你说的一些时间戳,发送序列号和请求序列号这些也只是从另外一端发回来的握手信息。跟你的问题好像没有关系。
    你的问题是“具备超时重发机制”
      

  11.   

    而且你这样实现的话还不如去使用TCP/IP方法,何必要使用UDP呢,难道你认为你写的代码会比Windows那帮家伙更厉害。UDP本身是用于不可靠,无连接的方法。
    假如我是你,我会选择TCP/IP方法,而不是UDP方法
      

  12.   

    TCP无法实现NAT传透我说的超时重发机制是说在一个套接字超过某个时间没有收到消息,系统应该能通知到我。这样我可以重新发送数据。否则UDP通讯无法进行下去了。
      

  13.   

    UDP能实现无条件NAT透传??请教: softrain(敢笑杨过不痴情)