读书人

小弟我编写的一个程序模块求指导

发布时间: 2012-04-11 17:42:33 作者: rapoo

我编写的一个程序模块求指导?
在服务器端有一个数据库,先把数据库中的资源添加到POST_INFO链表

C/C++ code
typedef struct  tagPostInfo {    char title[255];    char content[255];    u_long    group_addr; // group addr} POST_INFO;//发送论题列表        CPostInfoSet  m_PostRecordset;        CString strSQL;        strSQL.Format( "select * from PostInfo");                if(!m_PostRecordset.Open(AFX_DB_USE_DEFAULT_TYPE,strSQL))    {        TRACE0("打开数据库失败!\n");        return ;    }        while(!m_PostRecordset.IsEOF())    {        memcpy(postInfo.title,m_PostRecordset.m_title,strlen(m_PostRecordset.m_title)+1);        memcpy(postInfo.content,m_PostRecordset.m_content,strlen(m_PostRecordset.m_content)+1);        pDoc->AddPostInfo(postInfo);      //  AfxMessageBox(postInfo.title);        m_PostRecordset.MoveNext();    }    // 向登录用户发送列表         pDoc->SendPostListTo(postInfo, this);//..    // 向所有用户发送添加的消息        pDoc->AlterPost(PACKAGE_ADD_POST, &postInfo, this);//..函数定义如下void CServerDoc::SendPostListTo(POST_INFO& postInfo, CDataSocket* pSocket){    int cnt = m_lstPostInfo.GetCount();    int total = sizeof(WORD) + sizeof(cnt) + sizeof(POST_INFO) * cnt;    char* buf = new char[total];        // 拷贝欲发送的数据到缓冲区    *(WORD*)buf = PACKAGE_POSTLIST;    *(int*)(buf + sizeof(WORD)) = cnt;        POSITION pos = m_lstPostInfo.GetHeadPosition();    USER_INFO* p = (USER_INFO*)(buf + sizeof(cnt) + sizeof(WORD));    for (int i = 0; i < cnt; i++, p++) {        POST_INFO& info = m_lstPostInfo.GetNext(pos);        memcpy((void*)p, (void*)&info, sizeof(POST_INFO));    }    // 发送数据    if (pSocket->Send((void*)buf, total, 0) <= 0) {        TRACE0("failed to send postlist to user.");        return;    }    // 显示消息    CMainFrame* pFrame = (CMainFrame*)AfxGetMainWnd();    CServerView* pView = (CServerView*)pFrame->GetActiveView();        delete [] buf;}BOOL CServerDoc::AlterPost(WORD type, POST_INFO* pInfo, CDataSocket* pFrom){    CString strMsg;    CServerView* pView = (CServerView*)(((CMainFrame*)AfxGetMainWnd())->GetActiveView());    if (type == PACKAGE_ADD_POST) {        AddPostInfo(*pInfo);    }    else if (type == PACKAGE_DEL_POST) {        RemovePostInfo(*pInfo);    }    else {        return FALSE;    }    // 填充消息结构    const int bufLen = sizeof(WORD) + sizeof(POST_INFO);    char buffer[bufLen];        *(WORD*)buffer = type;    memcpy((void*)&buffer[sizeof(WORD)], (void*)pInfo, sizeof(POST_INFO));        // 向每个DataSocket发送消息    return m_pListenSocket->SendPackageToAll(buffer, bufLen, pFrom);}客户端接收到void CClientSocket::OnReceive(int nErrorCode) {    if (nErrorCode != 0) {        return;    }    // 注销FD_READ事件    if (!AsyncSelect(0)) {        TRACE0("AsyncSelect error.\n");        return;    }    // 读数据包类型    WORD wPackType = 0;    if (Receive(&wPackType, sizeof(wPackType), 0) != sizeof(wPackType))    {        TRACE0("Unable to receive package type!");    }    // 分析数据包类型    switch (wPackType)    {    case PACKAGE_POSTLIST:         OnReceivePostList();        break;    case PACKAGE_ADD_POST:         OnReceivePostAdd();        break;    case PACKAGE_DEL_POST:         OnReceivePostDel();        break;    case PACKAGE_MESSAGE: // 来自服务器的消息        OnReceiveMessage();        break;    case PACKAGE_LOGOUT:    case PACKAGE_LOGIN_ERROR:        OnReceiveLoginError(wPackType);        break;    case PACKAGE_REG_ERROR:        OnReceiveRegError(wPackType);        break;    case PACKAGE_SERVERCLOSE:        OnOffline(wPackType);        return; //注意, 既然已关闭套接字, 故直接返回    default:        break;    }    // 重新注册网络事件    if (!AsyncSelect(FD_READ | FD_CLOSE | FD_CONNECT)) {        TRACE0("AsyncSelect error.\n");        return;    }}void CClientSocket::OnReceivePostList(){    int len = 0;    // 读取列表长度    if (Receive((void*)&len, sizeof(len), 0) != sizeof(len))    {        TRACE0("Unable to receive name list length.");        return;    }    //    if (len == 0) {        return;    }    //    POST_INFO* pArray = new POST_INFO[len];    ASSERT(pArray != NULL);    // receive user list    if (Receive((void*)pArray, sizeof(POST_INFO) * len, 0) !=        (int)sizeof(POST_INFO) * len) {        TRACE0("Unable to receive post list data.");        return;    }    // 将其添加到列表    POST_INFO* pInfo = pArray;    for (int i = 0; i < len; i++, pInfo++) {        POST_INFO* p = new POST_INFO;        memcpy((void*)p, (void*)pInfo, sizeof(POST_INFO));        m_pMainWnd->AddPostInfo(p);    }    // 更新组合框的显示    m_pMainWnd->AddPostList();//..        //    delete pArray;}void CClientSocket::OnReceivePostAdd(){    POST_INFO* pInfo = new POST_INFO;    ASSERT(pInfo != NULL);    if (Receive((void*)pInfo, sizeof(POST_INFO), 0)         != sizeof(POST_INFO)) {        TRACE0("Unable to receive newly log in user data.\n");        return;    }    // 将其添加到用户列表    m_pMainWnd->AddPostInfo(pInfo);//..    // 更新组合框显示    m_pMainWnd->AddPostList();//..    // 向消息框加入新消息    CString strMsg;    strMsg.Format(IDS_POSTJOIN, pInfo->title,        inet_ntoa(*(in_addr*)&pInfo->group_addr),         pInfo->content);    m_pMainWnd->AddMessage(strMsg);}void    AddPostInfo(POST_INFO* info) {        m_PostList.AddTail(info);}BOOL CClientDlg::AddPostList(){    // Static 复位    if (m_PostList.GetCount() == 0)        return FALSE;    CListBox* pList = (CListBox*)GetDlgItem(IDC_POST_LIST);    pList->ResetContent();//清空数据    //    POSITION   pos = m_PostList.GetHeadPosition();    POST_INFO* pFirst;    //    for (int i = 0; i < m_PostList.GetCount(); i++)    {        POST_INFO* pInfo = m_PostList.GetNext(pos);        if (i == 0) {            pFirst = pInfo;        }        pList->AddString(pInfo->title);    }    //    pList->SetCurSel(0);//    OnSelchangeNamelistCombo();    return TRUE;} 

当然,客户端和服务端定义的链表都是一样的
C/C++ code
void    AddPostInfo(POST_INFO* info) {        m_PostList.AddTail(info);}
现在客户端的列表框中没有显示我要添加的列,是哪里出问题了?

[解决办法]

这个你就自己加点输出信息不就知道了么,比如加点日志,甚至MesaageBox都行

读书人网 >VC/MFC

热点推荐