winsock编写的聊天程序,如何在服务器端控制连入的客户端的个数? 用Winsock写了一个C/S模式的聊天程序,现在想在服务器端控制连入的客户端的个数。比如,允许最多10个客户端接入,第11个客户端connect的时候使之失败,这应该怎么做呢? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我曾经尝试在Server端的Accept线程中判断连入的客户端个数,如果达到最大值则不再accept新的客户端,当某个已连入的客户端退出会话后再继续accept。结果发现这样并不能使客户端的connect失败,客户端的connect成功地返回了!这之后的send函数也能正常返回。服务器端当然没有收到任何数据,但是当某个已连入的客户端退出会话后,服务器端立刻accept了这个客户端并收到了那些数据。应该怎么办才好呢? 定义一个记数变量COUNT然后在ACCEPT的消息中这样做if(count>10){ closesocket(...);}else{ count++; accept(...);} to zfive5(醉马不肖) :没有别的办法了吗? 下面是Accept线程的代码,g_nCltNum 是一个全局变量存放客户端的数量,accept了新的客户端后会使这个变量加1,有客户端退出的话会使之减1,并激活 g_hEvent。void _cdecl AcptThread( void* lpParam ){ int nAddrLen = 0; SOCKET sClient = 0; SOCKADDR_IN addr_Client; ZeroMemory( &addr_Client, sizeof( addr_Client )); while ( 1 ) { if( g_nCltNum < MAX_CLIENTS ) { nAddrLen = sizeof( addr_Client ); sClient = accept( gsSock, (struct sockaddr *)&addr_Client, &nAddrLen ); if ( sClient == INVALID_SOCKET ) { break; } AddClient( sClient ); _beginthread( ClientThread, 0, (void*)sClient ); } else { WaitForSingleObject ( g_hEvent , INFINITE ); } }}能不能在创建服务端Socket的时候就指定最大连入的客户端的数量呢? 大家有没有搞错啊, 这不是很明显的事情吗>??OnConnect(int ErrCode??){ if(count<N) Accept(CntSocketObject);} 在listen()中可以限定监听的次数,多与它时服务器不在LISTEN,所以更谈不上ACCEPT拉 listen()好像不是侦听的次数,而是侦听的队列数 用个全局变量来判断当>10的时候ACCETP的就都CLOSE掉 对,用个全局变量来判断当大于10,ACCETP的时候就都CLOSE掉 看来只有在大于的时候CLOSE掉了,谢谢大家。 两种基本重画之间的效率问题 关于启动服务 求32位MD5加密类 请问哪里有系统介绍驱动程序编程的网上资源? 又多了个三角,郁闷地放200分。再请问一下怎么把任意文件嵌在Exe或Dll里面,用的时候再释放出来? 甘心给高手送分--关于登录时的口令记录 vc++ CInternetSession 取网页数据时,出错 请教一个关于数据库的问题 如何深层直接退出 怎样屏蔽非法输入 捕捉光标 请问,Socket中的CString问题。
然后在ACCEPT的消息中这样做
if(count>10)
{
closesocket(...);
}
else
{
count++;
accept(...);
}
{
int nAddrLen = 0;
SOCKET sClient = 0;
SOCKADDR_IN addr_Client; ZeroMemory( &addr_Client, sizeof( addr_Client ));
while ( 1 )
{
if( g_nCltNum < MAX_CLIENTS )
{
nAddrLen = sizeof( addr_Client );
sClient = accept( gsSock, (struct sockaddr *)&addr_Client, &nAddrLen );
if ( sClient == INVALID_SOCKET )
{
break;
} AddClient( sClient );
_beginthread( ClientThread, 0, (void*)sClient );
}
else
{
WaitForSingleObject ( g_hEvent , INFINITE );
}
}
}能不能在创建服务端Socket的时候就指定最大连入的客户端的数量呢?
{
if(count<N)
Accept(CntSocketObject);
}
当>10的时候ACCETP的就都CLOSE掉