非阻塞的SOCKET莫明其秒被阻塞了。这是我看到的现像,感觉并不是本质。我使用一个非阻塞的SOCKET去发送多播数据,一切都很正常,突然,可能是在几分钟后,也可能是在一天后,sendto函数停在自己身上了,怎么样也不行了整个网络模块就这样死掉了。我心那个伤啊!为啥啊听有人讲,说是我可能发得太快,把下面的系统BUF给撑爆了。于是乎我发一个包延了个三毫秒,感觉好像是不错呢,平均坚持时间感觉是长了不少。有这种讲法吗?我认为下面如果收不了只会丢包呀,怎么会爆呢?但是我也实在是找不到其它原因了。
再没有人救我我就得去自刎了……PS:我的系统缓冲是16K,包是1032BYTE一个。
使用的语言是standard C,SOCKET是标准SOCKET,非WINSOCK。

解决方案 »

  1.   

    不要死循环的调用sendto函数。
      

  2.   

    如果太快,真的会死掉吗?现在的现像是那个线程就停在sendto这句上了。也不返回错误。
      

  3.   

    udp 数据包一次发送到端口的数据量为512个字节!
    sendto发送第一包以后不要用sleep 浪费cpu资源,sleep不一定是正好的系统发包时间 
    用select()函数 绑定udp socket的 write事件  
    发包以后 等待udp socket的 write事件 
    然后在调用 sendto()发送第2个数据包
      

  4.   

    to  Jasanye(叶子)我也认为是其它地方有溢出等可能性。
    但是又没有办法调试,没调试器。
    只有凭经验看哪儿有可能性出问题,再去DP。to 楼上两位,我试着发512还是出问题。重申一个现象:就是我发包后睡了三个豪秒就能坚持很久。我要死掉啦~~  对了,今天返回了一个错误:23525,我不论在哪儿也查不到这个错误,郁闷。
      

  5.   

    发送快只会阻塞,不会死掉得!!可以在发送之前判断是否阻塞
    例如:
    if( Send(……)== SOCKET_ERROR)if (GetLastError() == WSAEWOULDBLOCK) 
    {
    TRACE("Blocking\n");
    Sleep(100);
    break;
    }
      

  6.   

    有点畸形哦。
    我试过快速发送数据,缓冲区被填满,会返回错误,并且wsagetlasterror为10035。
    这时需要稍微sleep一下。10毫秒就够了