通信问题,对高手也许很简单 ( 积分: 300 )

  • 主题发起人 主题发起人 hegyi
  • 开始时间 开始时间
H

hegyi

Unregistered / Unconfirmed
GUEST, unregistred user!
我写一个C/S结构的程序,在通信时定义一个类似如下的结构:
TcomBlock=record
sendID,toID:Integer;
MSG:string[255];
end;
由于MSG使用定长度,在使用IdTcp控件时,服务器端和客房端都可以使用readBuff方法读出数据。这没问题。但是,255的长度太短,而且我希望使用不定长度通信,以节约带宽,即改为:
tcomBlock=record
size:integer;
sendID,toID:integer;
MSG:string;
end;
我的问题是:在写入数据和读取数据时应该注意什么问题才能成功呢?我注意到,无论MSG赋什么值,Sizeof(CB:Tcomblock)都是相同的值,CB.size:=sizeof(CB)就没有意义了。在服务端,由于不知道包的长度,怎么样正确读取数据呢?

另外,我分成两段来读,行吗?如果行,应该怎么做呢?最好有代码,谢谢先。

300分太少,可只允许300,回答得好另开贴加分。
 
string 其实是一个结构包含长度、计数和指针
你需要自己定义一种方式来接收数据
如:先发长度,然后再发数据
 
tcomBlock=record
size:integer;
sendID,toID:integer;
end;
var MSG:string;
tb:tcomBlock;
tmd:dword;
begin
msg:='1234567';
tb.size:=length(msg);
tb.sendID:=;
tb.toID:=;

// 发送头
udp.sendbuffer(tb,sizeof(tb));

// 岩石
tmd:=gettickcount()+808;
while tmd>=gettickcount() do
application.processmessage;

udp.sendbuffer(msg[1],length(msg));
end;
 
谢谢回答。
我使用了多线程,不同线程都使用同一个连接发送数据,数据最好是一次发送,如果作两次发送,先长度后内容,则有可能在长度有内容之间被另一个线程插入一信数据包。为避免这种情况,就得加锁,不方便,到可以一试。

不定长度的记录,为什么都一个长度呢?
 
tcomBlock=record
MSGSize:integer;
sendID,toID:integer;
MSG:string;
end;

CB.MSGSize:=Length(CB);
 
WQL的MSG[1]对我帮助很大,提示我其实应当传入Msg[1]的地址,而不是MSG或MSG[0]的地址。
我现在使用先发送长度,再发送数据的方式了.
 
后退
顶部