前言:做一个小的服务程序,对连接的客户端进行处理。考虑到一个客户只允许存在一个这样的连接,所以程序需要对连接的客户进行统计。现状:
用数组来管理客户机。采取如下方案:
CFVistor类封闭了客户机的相关数据及操作,主要的是客户机的ip及连接的socket:
class CFVistor
{
...
char m_szIp[16];
SOCKET m_sock;
...
}.
对每一个客户连接,生成一个临时的CFVistor对象,再将该对象入队(CArray <CFVistor, CFVistor> m_VstArr;).注意,入队时的对象是临时的.
下面是有连接到来时的处理.
////////////////////////////////////////////////////////////////////
/// 监听者
...
SOCKET sacc = accept (listen socket, addr, addr's length)
...
/// 判断请求连接的客户机是否已存在连接.
SockAccept (sacc, addr); // 它的功能即判断是否已连接了SockAccept的基本功能如下:///得到连接的客户机ip,检查CArray <CFVist, CFVist> m_VstArr中是否已存在该ip,如果存在则杀掉原来的socket,并更新为新的socket
////////////////////////////////////////////////////////////////////////////
/// 函数SockAccept (SOCKET s, sockaddr_in &from)
szip = ...
int nSize = m_VstArr.GetSize ();
for (int nCnt = 0; nCnt < nSize; ++nCnt)
{
CFVist &vst = m_VstArr.GetAt (nCnt);// GetAt将产生一个临时对象.vst是一个临时对象的引用
if (lstrcmpi (szip, vst.GetIp ()) == 0)
{
vst.Close (); // 关闭旧的socket
// 设置vst的sock 为新的socket
vst.SetSock (s);
////////////////////////////////////////////////
/// 注意,在此时通过vst访问s时仍然有效.但是如果将CArray中的对象更新
/// 的话,socket将成为无效的句柄。如下:
m_VstArr.SetAt (nCnt); // 如果不这样做,修改的只是一个临时的CFVistor对象。在
// 队列m_VstArr中的数据仍然是原来的.
////////////////////////////////////////////////////////////////////
/// 问题来了:在此处,再次通过vst来访问socket,则会出错。因为该socket已经无效
/// 对此,我曾试着添加了CFVistor的赋值函数"=",但无济于事。
}
}
为什么会出现上面这种情况,还请知道的人不啬赐教。谢谢。
另外说明下,如果用指针,则可以避免这种情况。原因很简单,指针可以直接修改其数据。
如果你不知道是什么原因造成这种情况的,也请你记下来,以免重面这样的问题。

解决方案 »

  1.   

    CArray <CFVistor, CFVistor&> m_VstArr
      

  2.   

    我认为使用map或者vector比较好,用指针容易出问题
      

  3.   

    赞同
        DentistryDoctor(雅克医生<从今天起正式改行>) 
        ProgramInHeart(忘掉明天,珍惜现在!) ( )
    观点。我认你的错误主要是
       CArray <CFVist, CFVist> m_VstArr
    定义有问题。一般的定义是这样的:
    1.使用对象:
       CArray <CFVist, CFVist&> m_VstArr
    2.使用指针
       CArray <CFVist*, CFVist*> m_VstPtrArr
      

  4.   

    还有,加入数组我都是用 Add 方法,不明白你为什么会用 SetAt ?
      

  5.   

    安楼上的方法
    使用对象:
       CArray <CFVist, CFVist&> m_VstArr
    使用指针
       CArray <CFVist*, CFVist*> m_VstPtrArr