因为我的系统可能会有突发性的大数据量消息,所以有时候会发生消息丢失的情况,专门开一个线程负责接收都来不及,我想设置UDP的接收buffer,当数据量大到来不及接收的时候系统会自动保存在buffer中,而不会丢失。(听一个朋友说在他用的操作系统中可以这样做,系统默认的buffer才几百k,他把buffer设置到10m后性能大幅度提高,不知windows下可不可以这么做?)
望高手指教!谢谢!

解决方案 »

  1.   

    你看看setsockopt()这个函数!SO_RCVBUF
      

  2.   

    ft,开玩笑吧,修改窗口大小不就是拿鼠标来拉一拉?哈哈
    我说的是修改Buffer大小啊
      

  3.   

    >>ft,开玩笑吧,修改窗口大小不就是拿鼠标来拉一拉?哈哈他说的窗口是tcp中的滑动窗口,不过这个概念在tcp中才有。bb123456789(bbb)的做法是正确的 。
      

  4.   

    //设置revc   buffer
    DWORD optval = 32768 ;  //32 kb 
    if(setsockopt(MySock.sock,SOL_SOCKET,SO_RCVBUF,(char *) &optval,sizeof(optval))==SOCKET_ERROR)
    {
    MessageBox(NULL,"Revc buffer set fail!","error",MB_OK);
    return 0;
    }
      

  5.   

    谢谢各位大侠!我这么做了,但不知道性能会有多少改善。:)
    顺便问一下,tcp中的滑动窗口是什么意思啊?能解释一下吗?
      

  6.   

    还有一个问题,如果setsockopt函数失败的话,会不会导致原来已经bind的sock不可用?我只是设置接收buff,如果失败,我希望原来已经bind的sock还是可以用来收发消息。
      

  7.   

    用WSAANSYCSELECT()选择FD_READ事件,其中有个参数是HWnd,设置它,并不窗口中用自定义的MESSAGE来进行数据处理,这就好了。
      

  8.   

    还有一个问题,如果setsockopt函数失败的话,会不会导致原来已经bind的sock不可用?我只是设置接收buff,如果失败,我希望原来已经bind的sock还是可以用来收发消息。
    没人回答吗?:(
      

  9.   

    setsockopt之所以返回失败,是因为一些参数不正确,或网络状况不对,对以前的socket没影响的。
      

  10.   

    If the setsockopt function is called before the bind function, TCP/IP options will not be checked with TCP/IP until the bind occurs. In this case, the setsockopt function call will always succeed, but the bind function call may fail because of an early setsockopt failing