我编写的一个程序模块求指导?
在服务器端有一个数据库,先把数据库中的资源添加到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都行