框架如下:
CSocketListen 从 CSocket 继承
CSocketClient 从 CSocket 继承
又有 CSocketOp 从CSocketClient继承过程如下:
1. 首先是连接:
先初始化系统,然后
void CSocketListen::OnAccept(int nErrorCode)
{
if ( nErrorCode == 0 )
{
CSocketOp *pCk = new CSocketOp();
if ( Accept( *pCk ) == TRUE )
{
... // 成功,把 pCk 加入到连接列表listSck中
}
}
}2. 创建一个定时器,1秒钟就向listSck中的所有socket都发送一个ping消息:
xxx::OnTimer( UINT nIDEvent )
{
if ( nIDEvent == 1 )
{
// 发送Ping消息
for ( int i = 0; i < listSck.GetCount(); i++ )
{
CSocketOp *pCk = listSck.GetItem( i );
if ( pCk != NULL )
{
pCk->Send( ... ); // 发送消息
}
} ... // 统计发送的情况,即发送到的IP地址。结果显示,在列表中的所有连接都有发送消息
}
}3. 在收到关闭消息时,就把自己从列表中删除:
void CSocketOp::OnClose(int nErrorCode)
{
... // 把自己从listSck中删除。经验证,这里操作是没有错误的
}问题:
当一个客户端连上来之后,我发送ping消息,成功,客户端正确接收
第二个客房端连上来之后,在timer1中循环发送给多个客户端,显示成功,但只有最新连上来的客户端上才实际收到ping消息
在第一个收不到消息后,主动断开连接,然后重新连上来。这时ping消息就只有这一个能实际收到了(是最新的一个连接),其它的就又会收不到消息,从而断开后重连,这样反复
为什么同一时间只有一个客户端能收到消息呢?
我要再确认一下