已经编写的一个例子上的客户/服务程序,开....

fpe2000 2000-04-20 01:18:00
3.已经编写的一个例子上的客户/服务程序,开始工程时没有
选择有数据库支持,现在该怎么办?
4.例子中的通信函数只能传递一条信息,如何使之传递多条
数据信息?比如,查询到几条数据记录,如何将其发送给客
户端?
5.客户端接收到几条数据记录后,怎样才能将其都显示出来?
可不可以在VIEW::ONDRAW()中用pDC->TextOut()显示出来?
接收信息,在绝大多数例子中是用CSocket::OnReceive()来
实现的。

所剩时间不多,望赐教!
...全文
201 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
fpe2000 2000-04-23
  • 打赏
  • 举报
回复
谢谢!
fpe2000 2000-04-22
  • 打赏
  • 举报
回复
1.我的程序是:客户机向主机发送汉字,主机按汉字作关键字查询电话号码,将会
得到几条匹配记录,每条记录有Address和Telephone数据。我不知如何将它们依次
发给客户,并如何接收?而且查询结果的数目是不确定的,因为会有未知数目的
匹配记录。
示例程序的发送及接收代码如下,请指教如何修改:
void CMainFrame::FetchMsg(CClientSocket *pClientSocket)
{
char pMsg[10000],tempMsg[1000];
int ByteCount;
int EndFlag=0;
char AnswerMsg[10100];
strcpy(pMsg," ");
do
{
strcpy(tempMsg," ");
ByteCount=pClientSocket->Receive(tempMsg,1000);
if(ByteCount>1000 and and ByteCount<=0)
{
MessageBox("receiving error","newwork msg",MB_OK);
return;
}
else if(ByteCount<1000&&ByteCount>0)
{
EndFlag=1;
}
tempMsg[ByteCount]=0;
strcat(pMsg,tempMsg);
}while(EndFlag==0);
MessageBox(pMsg,"network msg",MB_OK);
sprintf(AnswerMsg,"i receive it %s\n",pMsg);
SendMsg(pClientSocket,AnswerMsg); //////返回消息
}

void CMainFrame::SendMsg(CClientSocket *pClientSocket,char *pMsg)
{
pClientSocket->Send(pMsg,strlen(pMsg));
}
2.定义一个比较长的字串msg,msg="address1;telephone1;address2;telephone2;...."
' ; '为间隔符,将msg按原方式发出去,原方式接收,再分离出间隔符' ; ',
问题有:CString类可以用字符数组来表示吗?对于汉字数字混合数组,如何分离?
如msg="长沙市;1234567",如何处理单子节的数字和双字节的汉字的问题?
还有,CString可以有多长?
telan 2000-04-22
  • 打赏
  • 举报
回复
// str="ad1:phone1:.....ad_n:phone_n:";

CStringArray ar;
int nIndex,nStart;
nStart = 0;
nIndex = str.Find(':',nStart);
while(nIndex != -1)
{
ar.Add(str.Mid(nStart,nIndex-nStart));
nStart = nIndex+1;
nIndex = str.Find(':',nStart);
}



fpe2000 2000-04-22
  • 打赏
  • 举报
回复
thanks!
CString可以很容易地当作字符数组来处理,使用Find函数很容易处理:的拆分问题....

能不能说的详细些?
telan 2000-04-22
  • 打赏
  • 举报
回复
如果你是用CString来处理,长度只受内存的限制,所以没有任何问题,而且单字节/双字节问题也不用考虑,因为CString会自动识别,而且CString可以很容易地当作字符数组来处理,使用Find函数很容易处理:的拆分问题:
CString str = "ad1:phone1:ad2:phone2:..."
为了处理方便,可以在最后也加一个:.
telan 2000-04-20
  • 打赏
  • 举报
回复
服务器和客户端只要按照一定的格式来收发信息就行了,
具体的方式可以自己定,不同的协议采取的方式也完全不
一样,如果你要传递的数据是数据库的记录,采用自己定义
的数据包也许是最简单的,比如:可以这样定义
{
开始标志 :1BYTE BYTE
数据包编号:4BYTE DWORD
................
字段i: nBYTE // 如果字段i为数值型,定义相应的类型
...............
字段j的长度: mBYTE // 如果字段j为字符串
字段j的内容:****
............
结束标志:1BYTE
}

这样就可以一条记录打成一个包发给客户端,由客户端解包。

当然如果想更简单一些,也可以把所有的字段组合成一个字符串,
给客户端发过去,在客户端拆分成对应的各字段就行。

不太明白你到底想做什么事情。
fpe2000 2000-04-20
  • 打赏
  • 举报
回复
谢谢!
4.例子程序中,是用sendMsg()函数,传递一条信息,可我还是不懂如何传递多条信息,并被接收到。
5.我初次接触CSocket编程,vc++懂得不多,能否在后两条问题上说的再多些?
LastOne 2000-04-20
  • 打赏
  • 举报
回复
要在View类OnDraw里显示,可以在你的客户端类先定义C...View空类,再加一个
空类的指针, 在View类里例示客户端对象时把this指针传给空类指针, 在View定义一个
中转函数,就可以用这个指针显文字了,如
// h
class CMyView {}
class _Client : public CSocket
{
public:
CMyView *m_pView;
...
}
// c

this->m_pView->MyDisplay("text");

// class view c

void CMyView::MyDisplay(CString str)
{
CDC *pDC = GetDC();
pDC->TextOut(x,y,str);
}
这种方法显示的文字不会自动重画,只需做个窜数组在MyDisplay中添加在OnDraw循环一遍就行了.
telan 2000-04-20
  • 打赏
  • 举报
回复
3.很简单啊,用ClassWizard从CRecordset类派生新的类,记得
加上:
#include "afxdb.h"

4.取决于你传递数据的方式,你既可以一条记录,一条记录的分别发给客户端,也
可以一次性发过去,关键在于服务器端与客户端交互的协议。

5.你既然能够接收到数据,为什么不能显示呢??你如果将接收的数据放在公共缓冲区,
在OnDraw()中当然就能调用啦。

16,466

社区成员

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

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

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