socket问题出在哪里?

plane1980 2002-05-31 10:06:09
我出次使用socket,编了一个程序:
把客户端的操作系统版本号,处理器,内存等相关信息发送到服务器端
并显示在服务器端的Memo中,显示时为什么它不会回车换行。
代码如下:
客户端发送代码:
void __fastcall TForm1::Button2Click(TObject *Sender)
{
String buff;


//以下是获取操作系统版本信息
OSVERSIONINFO OSVI;
OSVI.dwOSVersionInfoSize=sizeof(OSVERSIONINFO);
GetVersionEx(&OSVI);
buff=IntToStr(OSVI.dwMajorVersion)+"."+
IntToStr(OSVI.dwMinorVersion)+"."+
IntToStr(OSVI.dwBuildNumber)+"."+
IntToStr(OSVI.dwPlatformId)+"."+
OSVI.szCSDVersion;
ClientSocket1->Socket->SendText("客户端操作系统版本信息:"+buff);



//以下是获取内存信息
MEMORYSTATUS meminfo;
meminfo.dwLength=sizeof(MEMORYSTATUS);
//获取内存信息
GlobalMemoryStatus(&meminfo);
buff=IntToStr(meminfo.dwMemoryLoad)+"%的内存在使用";
ClientSocket1->Socket->SendText("客户端"+buff);
buff="物理内存共有:"+IntToStr(meminfo.dwTotalPhys)+"字节";
ClientSocket1->Socket->SendText("客户端"+buff);
buff="虚拟内存空间大小为:"+IntToStr(meminfo.dwTotalVirtual)+"字节";
ClientSocket1->Socket->SendText("客户端"+buff);
buff="为使用的虚拟内存空间大小为:"+IntToStr(meminfo.dwAvailVirtual)+"字节";
ClientSocket1->Socket->SendText("客户端"+buff);


//系统时间
buff=TimeToStr(Time());
ClientSocket1->Socket->SendText("客户端当前时间:"+buff);
}
//------------------------------------------------------------------------

服务器端接受代码:
void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender,
TCustomWinSocket *Socket)
{
Memo1->Lines->Add(AnsiString(Socket->ReceiveText()));
}
//---------------------------------------------------------------------------
应该是接受一条信息就在MEMO中显示一行,下一条信息在新的一行显示的。
为什么程序在运行时,除了操作系统版本号显示在单独一行以外,其他都
连续显示在同一行呢?

...全文
42 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
jishiping 2002-05-31
  • 打赏
  • 举报
回复
虽然你是一条信息用Socket->SendText发送一次,但服务器端读取时并不是
按照你的想法一条一条读取的。所以你的程序在不同的机器上可能有不同的
结果。可能只有一行,也可能是两行,三行等。正确的写法,在每个信息后
面加上"\r\n",在服务器端读取添加到MEMO中时,不要使用Memo1->Lines->
Add,这个函数会自动添加换行符。

ClientSocket1->Socket->SendText(AnsiString("客户端操作系统版本信息:")+buff+"\r\n");
ClientSocket1->Socket->SendText(AnsiString("客户端")+buff+"\r\n");
//......其他的类推

服务器端接受代码:
void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender,
TCustomWinSocket *Socket)
{
Memo1->Text = Memo1->Text + Socket->ReceiveText();
}

supermarket 2002-05-31
  • 打赏
  • 举报
回复
因为不是每个包都分着接到,因此可能会连在一起,所以如果打算加入回车需要在发送的时候SendText加入".\r\n",接收的时候用Add方法假如空格并不可靠。

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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