我是这么做的:
1。首先在对话框中定义了一个变量来保存客户地址
CArray<SOCKADDR_IN,SOCKADDR_IN*>m_addrFrom;
2。然后在服务器端启动的时候将其地址保存在m_addrFrom【0】中,作为客户端发送的地址
3。然后在服务器端的接收数据线程中经过判断将第一次发送数据的客户地址加进m_addrFrom中
  SOCKADDR_IN* addrFrom=new SOCKADDR_IN;
....
  retval=recvfrom(sock,recvBuf,200,0,(SOCKADDR*)addrFrom,&len);
  dlg->m_addrFrom.Add(addrFrom);
4. 在客户端连接时将服务器地址保存在结构体中做为参数传给客户端接收数据的线程中接收数据
   m_pRecvParam->addrSrv=&m_addrFrom[0]//连接时;
 5。 在服务器发送数据时对保存的每个地址都发送一份数据
  GetDlgItemText(IDC_EDIT_MSG,msg);  
for(int i=1;i<=m_addrFrom.GetSize();i++)
{
sendto(m_sockSrv,msg,msg.GetLength()+1,0,
(SOCKADDR*)&m_addrFrom[i],sizeof(SOCKADDR));
}
这样做会出问题:
: error C2679: binary '=' : no operator defined which takes a right-hand operand of type 'struct sockaddr_in *' (or there is no acceptable conversion)

解决方案 »

  1.   

    CArray 里的数据类型要重载=运算符。
      

  2.   

    CArray<SOCKADDR_IN*,SOCKADDR_IN*>m_addrFrom;
      

  3.   

    CArray<SOCKADDR_IN*,SOCKADDR_IN*>m_addrFrom;
    这样做不太好吧,如果你需要保存的数据是来至于临时变量,那么而SOCKADDR_IN只是一个单纯的结构体。
    最好是使用类对象,毕竟mfc是面向对象设计出来的。可以参考以下
    class NetInformation{
    public:
    SOCKADDR_IN m_addr;NetInformation* operator=(NetInformation& netInfo){
          memcpy(m_addr,netInfo.m_addr,sizeof(SOCKADDR_IN));
          return this;
    }//运算符重载我不知道是不是这样写,应该差不多把,根据提示写吧
    };CArray<SOCKADDR_IN,SOCKADDR_IN*>m_addrFrom;
      

  4.   

    >CArray<SOCKADDR_IN*,SOCKADDR_IN*>m_addrFrom;
    >这样做不太好吧,如果你需要保存的数据是来至于临时变量,那么想简单就得多加小心,不过已经是SOCKADDR_IN*了就没有临时变量了.
      

  5.   

    TO:xujianlane(头文字C) 
    那样的话,你每添加一个元素就要NEW一个,这样在你不再使用的时候就需要自己手动DELETE回收内存。这不是更麻烦么?而且增加了工作量。
      

  6.   

    TO:star119119(叔叔阿姨大爷大妈,您的帖该结了吧!)你说的对,这么用是很不安全,只是一个不写=重载的办法.
      

  7.   

    TO:star119119(叔叔阿姨大爷大妈,您的帖该结了吧!)你说的对,这么用是很不安全,只是一个不写=重载的办法.
    ------------------------------------------------------------------
    ...........无语,危险的代码做出来的产品给客户。
      

  8.   

    我也是定义了CArray<SOCKADDR_IN,SOCKADDR_IN*>m_addrFrom;存放客户端信息,但是客户端减少后我怎么将m_addrFrom中响应的客户端信息去掉?
      

  9.   

    用CArray本来就不是一个好主意.
    标准模板库中这么多好用的,为什么非得选CArray.
      

  10.   

    你可以定义一个结构存放客户信息
    struct ClientInfo
    {
     SOOCKADDR_IN addr ;
     SOCKET       sock ;
    };
    客户关闭时把对应的sock结构删除