push不然不停的打数据进去,没多久就game over

解决方案 »

  1.   

    好象是,如果数据量太大,Loop
      

  2.   

    CSocket socket;
    int i;
    i=socket.Send( const void* lpBuf, int nBufLen, int nFlags = 0 );
    CString str;
    if(i=0)
    {
    MessageBox("发送字节为o");
    }
    else
    {
    str.Format("发送字节为%d",i);
    MessageBox(str);
    }
    返回的i即为发送的字节数
    email: [email protected]
      

  3.   

    怎么都喜欢用CSocket啊?
    发送数为0是因为数据太多,来不急发送出去,只要等待一下就好了。另外CSocket不是阻塞的吗?
      

  4.   

    跟踪出来了,是数据量太大,过一段时间后,获取错误代码,Blocking,用对话框显示出来了 ,
    等一会后,可以继续。
    如何解决?
    我调用调用 WSACancelBlocking();没用,必须等上30秒以上。CSocket默认是非阻塞方式吗?
      

  5.   

    我是这样实现的,发送返回是0的时候表示Send buffer已满,此时如果Buffer有空间的时候,即socket已传送一部份数据出去的话,会有OnSend()消息,这样问题就很好解决了,返回为0,则WaitFor..()一个事件对象,该事件对象在OnSend()消息处理函数中重置,一旦等到OnSend()发生,WaitFor()...返回,你就可以继续发送数据,这时候绝对不会再返回0。至于你说的判断Send buffer为空,我看有这个必要吗?只要它不满,我们就往里头发好了,我觉得编程实践中只要判断它不满就行了。
      

  6.   

    to Oldnew  
    how to :
    则WaitFor..()一个事件对象,该事件对象在OnSend()消息处理函数中重置,一旦等到OnSend()发生,WaitFor()...返回,
      

  7.   

    响应OnSend的话,是不是说明send buffer有空间进行数据发送?
      

  8.   

    因该是把,  
    TO oldnew:
    CEvent kkkkWaitForSigleObject(kkkk,30);   对吗? 是等30MS超时?
      

  9.   

    但是没有OnSend事件发生?!!
    Help me
      

  10.   

    WaitForSingleObject()不能和你的Socket类在一个线程里
    它会堵住Socket的消息,包括OnSend(),找一个例子看看,应该有好多这样的源码,我这儿有一个,太大(有其他功能),我没时间拆开了给你
      

  11.   

    一般来说,你不需要关心这个问题.如果你的数据发得太快而且tcp/ip系统软件无法及时发送给对端的话,你的write(sendto,send)调用会阻塞,直到tcp/ip系统软件腾出空间来存放新的数据
      

  12.   

    From MSDN Winsock reference,send function:......
    If no buffer space is available within the transport system to hold the data to be transmitted, send will block unless the socket has been placed in a nonblocking mode. On nonblocking stream oriented sockets, the number of bytes written can be between 1 and the requested length, depending on buffer availability on both client and server machines. The select, WSAAsyncSelect or WSAEventSelect functions can be used to determine when it is possible to send more data.
    .........在nonblocking模式下,缓冲区不可用,send函数会立刻返回SOCKET_ERROR,用WSAGetLastError()得到错误WSAEWOULDBLOCK.........
      

  13.   

    要命,我就是要长时间地发大量的 数据,并且,观察HUB并非网络物理速度不够,是Socket自己把自己宕掉了。艾,命苦吗,一定会搞定!谢谢大家,有力出力。。
      

  14.   

    你的问题我也存在,不过,在发送端我的问题没有你所说的问题,我用的是Winsock API , 使用完成事件通知的方式进行数据的发送,在使用UDP的方式下,获得了几乎是理论数据的传输速率.
      

  15.   

        1、用Windows Socket API自己编写,可以灵活控制;
        2、用CSocket类时,默认的方式应该是非阻塞方式。在长时间发大量数据时,经常发生阻塞现象。但我做过试验,好象用GetLastError不能捕获WSAEWOULDBLOCK错误码,这些工作CSocket类自己已经做了!但IsBlocking()函数我没有用过,你可以试试。
        3、注意,重载的OnSend()是对FD_SEND的响应处理函数。触发FD_SEND消息发生在两种情况下:1)用Connect()或Accept()建立连接时;2)在调用Send()因为阻塞而失败返回并且发送缓冲区重新变成可用时。
        4、如果用API,发送端应该不会出现阻塞,但接收端比较容易出现阻塞。不过在发送端发送大量数据时,应该说出现接收端阻塞的情况也很少。
        5、我觉得EaStar1110所说的,用事件通知的方法实现数据的发送在发送大量数据时肯定会阻塞(与用CSocket类的原理是一样的)。当然UDP的方式传输要快于TCP。希望EaStar1110能够将自己的具体实现过程贡献出来,让我们看看。
        6、用多线程实现可能要好一些。用一个线程专门侦听网络连接,一个线程专门发送数据。我现在还不清楚用CSocket的Accept(CAysncSocket& socket)时,创建的新的Socket是否就是一个线程?望高手指教!!!
      

  16.   

    Winsock有5种io模式,CSocket采用的是异步消息通知模式,这是为了适应最除的16位windows
    平台,是一种单线程 + 异步的模式,对于我们现在来说,使用多线程+阻塞的形式最简单。
    我曾经用send和recv发送和传输过图像,当传输量大于3M的时候就game over了,后来采用
    分块发送才搞定,不过这样做效率有问题。
    有一种i/o模式-重叠端口模式不错,可以不用socket的缓冲区,直接用用户缓冲区.
      

  17.   

    Winsock有5种io模式,CSocket采用的是异步消息通知模式,这是为了适应最除的16位windows
    平台,是一种单线程 + 异步的模式,对于我们现在来说,使用多线程+阻塞的形式最简单。
    我曾经用send和recv发送和传输过图像,当传输量大于3M的时候就game over了,后来采用
    分块发送才搞定,不过这样做效率有问题。
    有一种i/o模式-重叠端口模式不错,可以不用socket的缓冲区,直接用用户缓冲区.
    我同意!