利用VB的winsock6.0编写的数据传输程序,利用C++ Builder能够实时接收?怎么没人回应?嫌分少了吗?

zqhkd 2003-10-19 12:10:40
目前我们有个项目,数据采集系统的软件由用户提供,程序采用VB编写,采集数据是利用winsock6.0控件的客户机方式发送过来的。而我们采用C++ Builder 6.0编写一个数据处理与调度程序(为服务器方式),要求通过网络端口将这些数据实时接收、并同步显示。因此选择TServerSocket和TClientSocket组件进行网络通讯程序的编写(完全仿照CBuilder自带的聊天程序\examples\Internet\Chat),因此这部分程序肯定没有问题。目前的问题是:
(1)数据采集系统演示软件(针对简单的数据采集、网络通讯)如果也采用CBuilder,那么数据处理与调度程序能够将网络接收数据添加到TMemo编辑框中,同步、实时显示采集数据,工作正常;
(2)如果数据采集演示软件采用VB,那么数据处理与调度程序不能正常显示从网络端口传送过来的数据。并且现象很奇怪:每采集一个数据,如果直接通过Winsock的SendData函数传送,那么循环传送100组,另一端的数据处理与调度程序(服务器方式)的TMemo编辑框中未显示任何内容;但是,当在每个采集数据后面加上回车、换行符(0x0d、0x0a)之后,虽然不能在TMemo编辑框中同步、实时显示数据,但当最后一组传送完毕后,数据能够一次性的在TMemo编辑框中显示出来。
(3)在(1)和(2)中所采用的C++ Builder程序是系统的(包括客户机发送数据的程序)。
...全文
134 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
zqhkd 2003-11-23
  • 打赏
  • 举报
回复
VB的代码是别人的。采用winsock6.0控件中的SendData函数传送的,我也编程试了一下,情况类似。
yesry 2003-11-06
  • 打赏
  • 举报
回复
VB的代码呢?我做过Delphi,BCB,VB之间的通讯。
chensy0626 2003-11-06
  • 打赏
  • 举报
回复
那你试试将Socket设置为阻塞模式看看
zqhkd 2003-10-31
  • 打赏
  • 举报
回复
不用查看,单步调试时能够正常接收数据并正常显示在MEMO中,连续运行才有问题。
chensy0626 2003-10-31
  • 打赏
  • 举报
回复
在Debug下调试服务器端,看Receive的事件是否有响应,如果有看看接受到的数据是什么?
zqhkd 2003-10-30
  • 打赏
  • 举报
回复
VB端程序作为客户端,而CBC编写的程序为服务器。服务器端只是被动的接收从VB客户端发送过来的数据,并要进行实时处理。如果两端都利用cbc的控件时,无任何问题。但目前的难处在于,vb端程序由用户提供的标准程序,不能更改,故规定好固定的发送和接收的数据长度方法肯定行不通。盼各位大侠给我另想办法!
zqhkd 2003-10-30
  • 打赏
  • 举报
回复
1、发送一次是正常的。
2、我想到了时间间隔问题,加了延时也不行(程序中调用了DelayTime),延时时间反复调整过。
3、即使加了延时能够实现传输,我也不能认可,因为服务器端一定要和客户端同步,以达到实时处理效果。另外,服务器端和客户端均采用bcb控件是能够达到这一效果的。
叶子哟 2003-10-30
  • 打赏
  • 举报
回复
没做过,最好不要用非阻塞型来做数据传输
chensy0626 2003-10-30
  • 打赏
  • 举报
回复
你用的是ClientSocket和ServerSocket两个控件吗?
建议你在发送和接收时使用SendData和ReceiveBuf两个函数,并且规定好固定的发送和接收的数据长度,数据如果不够可以补\0等办法。就是说两端最好定义一个协议。
chensy0626 2003-10-29
  • 打赏
  • 举报
回复
1,首先在客户端不要用for循环发送,你只发送一次看服务器端是否能够接受正确
2,如果你用的是bcb的控件,在连续发送时如果两次发送中间间隔的时间很短服务器端会认为是一次发送的数据
wly033 2003-10-27
  • 打赏
  • 举报
回复
代码太多了,看起来吃力。
zqhkd 2003-10-27
  • 打赏
  • 举报
回复
源程序我都给出了,怎么没有一个人能够回答我的这个问题?
shally5 2003-10-21
  • 打赏
  • 举报
回复
我有一个BCB串口通讯的简单的例程序,你可以看一看。
kaimy 2003-10-21
  • 打赏
  • 举报
回复
我没有做过VB,不知道!
pp616 2003-10-21
  • 打赏
  • 举报
回复
莫名
zqhkd 2003-10-20
  • 打赏
  • 举报
回复
这是通讯相关的部分程序清单,我始终认为程序应没有多大问题,是不是那个属性设置不对。


// 当mode = 1 时,将从文件读取的数据直接输出到DataDisp的多行编辑框中
// 当mode = 2 时,将从文件读取的数据直接通过网络端口输出
void TMainForm::ReceiverDataFromFile(int mode)
{
//TODO: Add your source code here
FILE *fp;
char tmpc;
DispItemStrc CurDispItem;
AnsiString DispItemStr("");
AnsiString OrgiItemStr("");

// GzzdDataModule->DispItemTable->MasterFields="";
// GzzdDataModule->DispItemTable->Filtered = false;

fp = fopen("23051802.ZJ3","rb");
do{
tmpc = fgetc(fp);
if(tmpc!=0x0d) OrgiItemStr+=tmpc;
else{
if(OrgiItemStr.Length()<16){
CurDispItem = GetDispInf(OrgiItemStr);
CurDispItem = GetDispStr(CurDispItem);
if(CurDispItem.type ==0)
DispItemStr.sprintf("%s,%s",CurDispItem.idHex,CurDispItem.name);
else
DispItemStr.sprintf("%s,%s,%f%s",CurDispItem.idHex,CurDispItem.name,CurDispItem.val,CurDispItem.unit);
}
switch(mode){
case 1: DataDisp->Lines->Add(DispItemStr);
break;
case 2: OrgiItemStr+='\r';OrgiItemStr+=char(0x0a);
SendDataByNet(OrgiItemStr);
break;
}
OrgiItemStr="";
// 每个字符串传输后进行延时处理
DelayTime(30);
}
}while (tmpc!=EOF);
fclose(fp);
}

void __fastcall TMainForm::suiButton10Click(TObject *Sender)
{
if(ClientSocket->Active) ClientSocket->Active = false;
if(InputQuery("计算机连接到","地址名:",Server)){
if(Server.Length()>0){
ClientSocket->Host = Server;
ClientSocket->Active = true;
}
}
}
//---------------------------------------------------------------------------

void __fastcall TMainForm::FormCreate(TObject *Sender)
{
ClientSocket->Active = false;
ServerSocket->Active = true;
}
//---------------------------------------------------------------------------

void __fastcall TMainForm::suiButton11Click(TObject *Sender)
{
ClientSocket->Active = false;
ServerSocket->Active = true;
StatusBar1->Panels->Items[0]->Text =" 监听......";
}
//---------------------------------------------------------------------------

void __fastcall TMainForm::ServerSocketAccept(TObject *Sender,
TCustomWinSocket *Socket)
{
IsServer = true;
StatusBar1->Panels->Items[0]->Text =" 已连接到:" + Socket->RemoteAddress;
}
//---------------------------------------------------------------------------

void __fastcall TMainForm::ClientSocketError(TObject *Sender,
TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode)
{
StatusBar1->Panels->Items[0]->Text =" 错误连接到:" + Server;
}
//---------------------------------------------------------------------------

void __fastcall TMainForm::suiButton12Click(TObject *Sender)
{
AnsiString DispItemStr;
if(IsServer) DispItemStr = "12345678\n";
else DispItemStr = "网络连接的正确性校验字符串!\n";
SendDataByNet(DispItemStr);
}
//---------------------------------------------------------------------------

void __fastcall TMainForm::ServerSocketClientRead(TObject *Sender,
TCustomWinSocket *Socket)
{
Memo2->Lines->Add(Socket->ReceiveText());
}
//---------------------------------------------------------------------------

void __fastcall TMainForm::ClientSocketRead(TObject *Sender,
TCustomWinSocket *Socket)
{
Memo2->Lines->Add(Socket->ReceiveText());
}
//---------------------------------------------------------------------------

void __fastcall TMainForm::ClientSocketConnect(TObject *Sender,
TCustomWinSocket *Socket)
{
StatusBar1->Panels->Items[0]->Text =" 已连接到:" + Socket->RemoteAddress;
}
//---------------------------------------------------------------------------

void __fastcall TMainForm::suiButton13Click(TObject *Sender)
{
ReceiverDataFromFile(2);
}
//---------------------------------------------------------------------------

void TMainForm::DelayTime(int ms)
{
//TODO: Add your source code here
int i,j,k;
for(k=0;k<ms;k++)
for(i=0;i<1000;i++)
for(j=0;j<1000;j++) (i*j) % 9;
}

void TMainForm::SendDataByNet(AnsiString DispItemStr)
{
//TODO: Add your source code here
if(IsServer) ServerSocket->Socket->Connections[0]->SendText(DispItemStr);
else ClientSocket->Socket->SendText(DispItemStr);
}
rookieme 2003-10-19
  • 打赏
  • 举报
回复
把源程序给出来,
两者我都做过,没任何问题的,winsock是一个标准接口,使用用linux都没问题的,还是好好看看你的char * 或 String数据吧

1,317

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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