求解决方法:Server端接到大量的数据后,然后要把这些数据发送大所有的Client( 250 个Client ),请问怎么解决?

citywolf 2004-12-16 08:40:13
求解决方法: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;
}
...全文
170 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
flashboy 2004-12-20
  • 打赏
  • 举报
回复
同意 HunterForPig(留着口水的猪)的观点,如果是在局域网内最好还是使用多播来解决,如果是在广鱼网上,你要考虑你的服务器的带宽是否足够,不知道你每个包有多少字节数字,你自己可以算一下,可以算出服务器所需要的最小带宽。 例如你每秒有 40 + 250*40 = 10040 (Packags)的进出流量,如果你的每个PACKAGE有200字节,那么10040*200*8 = 16Mbps 左右的带宽。
hxblvc 2004-12-17
  • 打赏
  • 举报
回复
学习...
HunterForPig 2004-12-17
  • 打赏
  • 举报
回复
如果是在同一局域网中,且数据相同,建议用广播
不同网段的用就要用多播了

如不是:
开个缓存区把数据放进去,至于什么结构的缓存区就看自己的实际应用了!
开个线程发送,
有一点要注意,如果发送,接受都用同一缓存区,注意同步
nuaawenlin 2004-12-17
  • 打赏
  • 举报
回复
如果这些客户机从服务器接受的数据都是一样的话,最好使用多播
MZP 2004-12-17
  • 打赏
  • 举报
回复
服务器端主动发送,出错的机率很大。
可否考虑客户端主动取数据。
服务器端接收到数据包后,放在堆栈中,每个客户端到堆栈中去取数据。
weiziyuner 2004-12-17
  • 打赏
  • 举报
回复
The socket is marked 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;

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧