关于CPtrList的一个奇怪的问题,大家帮忙看看
一个通讯程序
在OnAccept()里面如果这样
pSendToClientSocket = new CSendToClientSocket(this);
if ( pAcceptClientDataSocket->Accept(*pSendToClientSocket) )
{
//遍历服务器内存块
//将内存块里面存有的socket指针遍历一下后,添加
POSITION pos;
bool bValue = false;
///////////////////////下面m_ClientSocketList没有问题
for(pos = m_ClientSocketList.GetHeadPosition();pos!=NULL;)
{
CSendToClientSocket* pSock = (CSendToClientSocket*)m_ClientSocketList.GetNext(pos);
if( pSock==pSendToClientSocket)
{
bValue = true;
break;
}
}
//没有找到是添加到运行时socket指针list中
if(bValue==false)
{
CString IpAddress;
UINT port;
pSendToClientSocket->GetPeerName(IpAddress,port);
// pSendToClientSocket->m_ClientPicIndex = ClientPicIndex;
pSendToClientSocket->m_ClientPort = port;
pSendToClientSocket->m_ClientIP = LPSTR(LPCTSTR(IpAddress));
m_ClientSocketList.AddTail(pSendToClientSocket);
}
}
可如果在OnReceive()里面
我再这样
POSITION pos;
bool bValue = false;
////下面就执行不通过了 这是什么原因??????????
for(pos = m_ClientSocketList.GetHeadPosition();pos!=NULL;)
{
CSendToClientSocket* pSock = (CSendToClientSocket*)m_ClientSocketList.GetNext(pos);
if( pSock==pReceiveData)
{
bValue = true;
break;
}
}
//没有找到是添加到运行时socket指针list中
if(bValue==false)
{
CString IpAddress;
UINT port;
pReceiveData->GetPeerName(IpAddress,port);
// pReceiveData->m_ClientPicIndex = ClientPicIndex;
pReceiveData->m_ClientPort = port;
pReceiveData->m_ClientIP = LPSTR(LPCTSTR(IpAddress));
m_ClientSocketList.AddTail(pReceiveData);
}
debug看到 在OnAccept里面时 m_ClientSocketList的cnt=0
而在OnReceive里面事 m_ClientSocketList的cnt=???,好像他找不到方向似的,请问这是怎么回事?
怎么解决啊?
问题点数:100、回复次数:7Top
1 楼xxrl(孔曰成仁,孟曰取媳妇-->她太有才了)回复于 2005-06-03 12:35:15 得分 0
客户端发送socket 服务端接收时用CPtrList保存没有问题,可是一到Receive时 这个对象好像没了
我是在头文件中这样定义的
CPtrList m_ClientSocketList;
将客户端连接的SOCKET保存起来 以方便以后群发数据。。。Top
2 楼younggle(洋溢)回复于 2005-06-03 12:41:46 得分 50
m_ClientSocketList是谁的成员变量??
还有你看你定义的Socket对 OnAccept 和 OnReceive() 是不是同一个?
是否是局部变量??Top
3 楼xxrl(孔曰成仁,孟曰取媳妇-->她太有才了)回复于 2005-06-03 12:46:51 得分 0
噢 一个对话框
两个socket类
m_ClientSocketList是对话框的成员
对话框中有访问socket类的OnAccept和OnReceive的函数
在OnAccept()里面是
void CAcceptClientDataSocket::OnAccept(int nErrorCode)
{
// TODO: Add your specialized code here and/or call the base class
CSocket::OnAccept(nErrorCode);
m_pRealtimeDlg->OnDataAccept();
}
在OnReceive里面是
void CSendToClientSocket::OnReceive(int nErrorCode)
{
// TODO: Add your specialized code here and/or call the base class
CSocket::OnReceive(nErrorCode);
m_pRealtimeDlg->OnDataReceive(this);
}Top
4 楼xxrl(孔曰成仁,孟曰取媳妇-->她太有才了)回复于 2005-06-03 12:48:33 得分 0
在m_pRealtimeDlg的OnDataAccept函数里面时调用m_ClientSocketList没有问题
可在OnDataReceive里面调用m_ClientSocketList却是一开始我说的情况 这是为什么?
有什么建议?Top
5 楼koko1998(高价购买火车票)回复于 2005-06-03 12:58:11 得分 50
gzTop
6 楼xxrl(孔曰成仁,孟曰取媳妇-->她太有才了)回复于 2005-06-03 13:05:37 得分 0
我晕Top
7 楼xxrl(孔曰成仁,孟曰取媳妇-->她太有才了)回复于 2005-06-03 13:13:09 得分 0
问题解决了 我在CSendToClientSocket构造时没有把对话框对象赋给m_pRealtimeDlg 而在接收的socket类的构造里面我赋值了 所以就没有问题
谢谢看过的和关注过此帖子的同僚们 虽然鲜有回答的,但up也是我非常开心的事.....Top




