求解决方法:Server端接到大量的数据后,然后要把这些数据发送大所有的Client( 250 个Client ),请问怎么解决?每秒大概有40个数据包过来,然后把这40个数据包发到所有的client,client有250个,
问题出在了:当我循环Send发送时,不是每次都出错,但是会经常出10035的错误!
这个时候是不是需先把这些数据包写入队列,然后再开一个线程去一个个的发送,这样就不会出10035的错误了?如果是这样,那请问怎么样把数据写入队列,再怎么样去开一个线程把队列中的数据读出来,然后一个个的发送出去??我的代码如下:
//发送数据到客户端
int SendDataToAllClient(CString strText)
{
//发送数据到所有的client
int nSendCount = -1;
POSITION pos = m_gpClientSocketList->GetHeadPosition();
if( pos == NULL )
return nSendCount;
if( pos )
{
for(int i=0;i<m_gpClientSocketList->GetCount();i++)
{
CHLSocket *pHLSocket = static_cast <CHLSocket *>(m_gpClientSocketList->GetNext( pos ) );   
    if( pHLSocket == NULL )
return -1;
if( pHLSocket->m_hSocket != NULL )
{
//判断是否处于阻塞模式
if( !pHLSocket->IsBlocking() )
{
Sleep( 100 );
//处于非阻塞模式,立即发送数据到client
nSendCount = pHLSocket->Send( strText, strlen( strText ), 0 );
}
else
{
//处于阻塞,等待100
DWORD dwResult = ::WaitForSingleObject( &pHLSocket->m_hSocket, 100 );
//再次发送数据到client
nSendCount = pHLSocket->Send( strText, strlen( strText ), 0 );
}
}
}
}
return nSendCount;
}

解决方案 »

  1.   

    The socket is ed as nonblocking and the requested operation would block.if you use thread ,it may be better to use the WINSOCK API instead of the CSocket and CAsyncSocket class because the CSocket and CAsyncSocket is not thread safe.It use the
    TLS to store data;
      

  2.   

    同意 HunterForPig(留着口水的猪)的观点,如果是在局域网内最好还是使用多播来解决,如果是在广鱼网上,你要考虑你的服务器的带宽是否足够,不知道你每个包有多少字节数字,你自己可以算一下,可以算出服务器所需要的最小带宽。 例如你每秒有 40 + 250*40 = 10040 (Packags)的进出流量,如果你的每个PACKAGE有200字节,那么10040*200*8 = 16Mbps 左右的带宽。