我用最后一点分来问一个问题

tan625747 2009-09-11 02:15:17
这是用VC6做,关于网络编程,方面的,一个单文档文件。
有以下文件:
Source Files”有:
Client.cpp
ClientDoc.cpp
ClientView,cpp
MainFrm.cpp
MyDirDlg,cpp
SearchDlg,cpp
StdAfx.cpp

Hearder Files有:
Client.h
ClientDoc.h
ClientView,h
MainFrm.h
MyDirDlg,h
SearchDlg,h
StdAfx.h

有以下关键类:
CMainFrame
CmyDirDlg对话框类用,在对话框里显示磁盘信息。
CsearchDlg 对话框类,用于说明对比问题出现的,新建一个类。

主要思路以及核心函数及问题所在:
在 CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) 用AfxBeginThread((AFX_THREADPROC)MyThreadLS,this) 启动线程。
MyThreadLS(void *pParam)建立套接字;用Select 模型的方式分两步走,存在可读的套接字,用CMainFrame::Send(SOCKET cSend)函数,存在的可写套接字用BOOL CMainFrame::Recv(SOCKET cRecv)函数。问题出现在,可写套接字用BOOL Recv(SOCKET cRecv)这一支。

BOOL CMainFrame:: Recv(SOCKET cRecv)里包括出现问题的,用于接收目录BOOL CMyDirDlg::RecvDirString(int nDataLen,SOCKET s)函数。在BOOL CMainFrame:: Recv(SOCKET cRecv)里,我是用 CMyDirDlg *pCMyDirDlg;
pCMyDirDlg->RecvDirString(nDataLen,s))的方法,把RecvDirString(nDataLen,s))放在在对话框类CmyDirDlg上,在话框类CmyDirDlg上有Tree 控件对应变量为m_Tree
由于接收到了磁盘目录信息,必需显示出来,在对话框类的CmyDirDlg的RecvDirString(nDataLen,s))函数用Tree控件显示出来。

以下是


/*
* 接收目录包括根目录和显示出来
*/
BOOL CMyDirDlg::RecvDirString(int nDataLen,SOCKET s)
{
CMyDirDlg* pMyDirDlg=new pMyDirDlg;


BOOL reVal = TRUE; //返回值
int nReadLen = 0; //接收数据长度
int nTotalLen = 0; //已读数据长度

list<string> listDir; //二级目录链表

listDir.clear(); //清空
string strDir; //二级目录

while ( nTotalLen != nDataLen )
{
char cRecv; //接收字符
SOCKET sClient =s;
nReadLen = recv(sClient, &cRecv, 1,0); //每次接收一个字符
if (SOCKET_ERROR == nReadLen)
{
AfxMessageBox(_T("读取目录失败!"));
reVal = FALSE;
}else if (0 == nReadLen)
{
AfxMessageBox(_T("服务器关闭了连接!"));
reVal = FALSE;
}else if (nReadLen > 0)
{

if ('<' == cRecv) //二级目录的开始分隔符,
{
strDir.erase(strDir.begin(), strDir.end()); //清除数据

}else if ('>' == cRecv) //二级目录的结束分隔符
{
listDir.push_back(strDir); //加入二级目录链表中

}else
{
strDir += cRecv; //添加字符
}
nTotalLen += nReadLen;
}
}

//上面部分运行发现都正确,没有什么问题,表明已正确收到信息。



list<string> &listSubDir=listDir;
list<string>::iterator itSubDir = listSubDir.begin();
for (itSubDir; itSubDir != listSubDir.end(); ++itSubDir)
{
//从二级目录链表中取出一个目录(包含了若干三级目录)
string strSubDir = *itSubDir;

string strFind = "\\"; //二级目录与三级目录的分隔符
int rootPos = strSubDir.find(strFind); //找到分隔符位置
if (rootPos != string::npos)
{
//二级目录名称
string strSubDirName = strSubDir.substr(0, rootPos);

AfxMessageBox(strSubDirName.c_str());正确能收到磁盘符号。
//调试发现出在 HTREEITEM hti =pMyDirDlg->m_Tree.Ctrl.InsertItem(_T("IP"));

//加入树视的二级节点
// HTREEITEM m_hTreeCur; //m_TreeCtrl //树的当前子项句柄
// HTREEITEM hChild =pMyDirDlg->m_TreeCtrl.InsertItem(_T(strSubDirName.c_str()), m_hTreeCur,TVI_LAST);
AfxMessageBox(strSubDirName.c_str());

//移动二级目录之后的位置,就是三级目录开始的位置
string::iterator itstr = strSubDir.begin();
int nOffet = 0;
while (nOffet < rootPos +1)
{
itstr++;
nOffet++;
}

//将三级目录加入树视二级节点中
string item;//临时变量,保存三级目录
for (; itstr != strSubDir.end();++itstr)
{
if (SEPERATOR == *itstr)//三级目录分隔符'|'
{
//加入三级目录
// dlg.m_Tree.InsertItem(item.c_str(), hChild, TVI_LAST);
item.erase(item.begin(),item.end());
}else
{
item += *itstr;
}
}

}
//nChild++;//增加二级目录的数量
}
//HTREEITEM m_hTreeCur; //树的当前子项句柄
// dlg->m_tree.Expand(m_hTreeCur,TVE_EXPAND);
listDir.clear(); //清空链表
return true;
}





出现的问题话句

AfxMessageBox(strSubDirName.c_str());正确能收到磁盘符号。
//调试发现出在 HTREEITEM hti =pMyDirDlg->m_Tree.Ctrl.InsertItem(_T("IP"));
真是想不出,为什么是这样。更不用说了pMyDirDlg->m_TreeCtrl.InsertItem(_T(strSubDirName.c_str()), m_hTreeCur,TVI_LAST);

我想知道了上面的问题,后面的好办。
对比发现,如果我把以上所有关键网络函数都放在CsearchDlg对话里用Tree控件显出来,发现没有什么问题,能够正确接收和显示出来。


感谢你们了:
不知道自己有没有把问题说清楚,自己认为可能是类之间传递函数或参数弄错,有什么解决方法,或知道在确的原因,感激不尽。

...全文
80 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
tan625747 2009-09-13
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zhengq06 的回复:]
不懂 帮顶
[/Quote]

谢谢帮顶呀
zhengq06 2009-09-12
  • 打赏
  • 举报
回复
不懂 帮顶

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧