我是这么做的:
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<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)
这样做不太好吧,如果你需要保存的数据是来至于临时变量,那么而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;
>这样做不太好吧,如果你需要保存的数据是来至于临时变量,那么想简单就得多加小心,不过已经是SOCKADDR_IN*了就没有临时变量了.
那样的话,你每添加一个元素就要NEW一个,这样在你不再使用的时候就需要自己手动DELETE回收内存。这不是更麻烦么?而且增加了工作量。
------------------------------------------------------------------
...........无语,危险的代码做出来的产品给客户。
标准模板库中这么多好用的,为什么非得选CArray.
struct ClientInfo
{
SOOCKADDR_IN addr ;
SOCKET sock ;
};
客户关闭时把对应的sock结构删除