每个包:数据长度(4个字节)+数据, 这个怎么实现?

msm 2007-06-29 09:28:52
想做一个socket程序,客户端每个发送的包组成原则是 :
数据长度(4个字节)+数据

但是具体写的过程有些转换不太了解:
1、首先应该是有个char(4)表示长度,如何把数据的长度int给char(4)?
2、按照sendbuf发送,如何把char(4) 和数据内容string合成一个char数组 或者pchar ?
多谢各位!
...全文
808 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
rainv 2007-07-02
  • 打赏
  • 举报
回复
mark
hongqi162 2007-06-29
  • 打赏
  • 举报
回复
数据长度(4个字节) Integer本身就占4个字节
hongqi162 2007-06-29
  • 打赏
  • 举报
回复
var
ms:TMemoryStream;
I:Integer;
s:string;
j:Integer;
begin
ms:= TMemoryStream.Create;
i:=122200;
s:='fdsafdsafdsafdsafdsafdasfdsa';
ms.Write(i,sizeof(i));
ms.Write(s,length(s));
ms.Position:=0;
ms.Read(j,4);
showmessage( IntToStr(J) );
ms.Free;
end;
msm 2007-06-29
  • 打赏
  • 举报
回复
呵呵,楼上兄弟可能没看懂问题意思
首先得到发送内容的长度然后把长度保存到4字节长度的变量中,然后把这个长度变量和数据内容一起sendbuf过去
imho888 2007-06-29
  • 打赏
  • 举报
回复
var

iTxt:string;

.....
iTxt:='1234';
IdTCPClient1.Write(iTxt);

或者

var
iBuff:array[0..3] of byte;
iBuff[0]:=$01;
iBuff[1]:=$02;
iBuff[2]:=$03;
iBuff[3]:=$04;

IdTCPClient1.WriteBuffer(iBuff[0],4,true);

我用的是INDY控件,其它控件用法都差不多。

ERR0RC0DE 2007-06-29
  • 打赏
  • 举报
回复
>> s:='fdsafdsafdsafdsafdsafdasfdsa';
>> ms.Write(i,sizeof(i));
>> ms.Write(s,length(s));
^^^^ error

ms.Write(s[1], Length(S));


>>type
>> myDatatype=recode
>> myLen:integer;
>> myTxt:string;
>>end;

>> WriteBuffer(iDataType,sizeof(iDataType),true);

myTxt: string是一个指针,字串的内容在指针指向的地方,将指针发给另一方有什么用?
ERR0RC0DE 2007-06-29
  • 打赏
  • 举报
回复
type
PMyPacket = ^TMyPacket;
TMyPacket = packed record
Len: Integer;
Str: array [0..0] of Char;
end;

function SendData(const AData: string): Boolean;
var
Packet: PMyPacket;
L, DataLen: Integer;
Buffer: array [0..10240 - 1] of Char;
begin
L := Length(AData);
DataLen := SizeOf(L) + L;

Packet := @Buffer[0];
Packet.Len := htonl(L);
Move(AData[1], Packet.Str[0], L);

Result := Socket.SendBuf(Buffer[0], DataLen) = DataLen;
end;
池龙 2007-06-29
  • 打赏
  • 举报
回复
用LoWord、HiWord可以将4字节拆成2个Word,再用LoByte、HiByte将其拆成4个Byte。

根据你发送的顺序,将Byte1-Byte4分别用chr()函数转成字符发送。

接收方用MakeWord、MakeLong还原。
msm 2007-06-29
  • 打赏
  • 举报
回复
sendstream也有些疑问,通过socket.sendsteam(ms)后。执行ms.free出错!

难道ms在sendstream后自动释放了?
msm 2007-06-29
  • 打赏
  • 举报
回复
服务端是java的,sendstream后服务端收到的数据内容看不懂
sendtext却可以
imho888 2007-06-29
  • 打赏
  • 举报
回复
定义个类型

type
myDatatype=recode
myLen:integer;
myTxt:string;
end;

var
iDataType:myDatatype;
...

iDataType.myLen:=长度
iDataType.myTxt:=内容

WriteBuffer(iDataType,sizeof(iDataType),true);

接收端同样道理,类型定义相同。
msm 2007-06-29
  • 打赏
  • 举报
回复
不用stream,sendText该怎么实现呢?
msm 2007-06-29
  • 打赏
  • 举报
回复
通过ms发的字符串怎么内容不对呢

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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