socket通讯,怎么发送动态数组?我按下面的程序发了,可接收到的是乱码(50分)

  • 主题发起人 主题发起人 kiths
  • 开始时间 开始时间
K

kiths

Unregistered / Unconfirmed
GUEST, unregistred user!
TMSGData=Record
Strlength:integer;
Str:Array of char;
end;

procedure TfrmClientMain.tbSendClick(Sender: TObject);
var MSGData:TMSGData;
i,len:integer;
SendStr:string;
tmpPchar: pchar;
begin
SendStr:='<SMSMsg>13900239223$break$13916809666$break$天之道损有余而补不足,是故虚胜实,不足胜有余$break$-YYFA';
len:=length(SendStr);
MSGData.Strlength:=len;
SetLength(MSGData.Str,len);
tmpPchar := pchar(SendStr);
for i := 0 to len-1 do
begin
MSGData.Str := tmpPchar;
end;
memo1.lines.add(inttostr(len));
memo1.lines.add(inttostr(sizeof(integer)+len));
Messagebox(0,pchar(MSGData.Str),'',MB_OK);
ClientSocket.Socket.Sendbuf(MSGData,sizeof(integer)+len);
end;
 
有没有人帮忙啊?
 
哪位大哥可以帮忙啊?
 
为什么要用动态数组?
 
对方的接口str的长度是不定的
 
有没有大侠帮我啊?
 
TMSGData是必须要定义的吗?
Strlength:integer的内容要发送吗?
对方用什么东东接收? Windows微机?
 
我搞定了,分两次发,一次发用sendbuf发strlength,然后再用sendtext发送sendstr,阁下有何高见?
 
这个东西能不能一次性发出去啊?请大侠们帮帮忙哦
我郁闷死了
 
你要看一下动态数组的结构,应该不能用做缓冲
 
var
TmpStr:TMemoryStream;
len:integer;
SendStr:string;
begin
TmpStr:=TMemoryStream.Create;
SendStr:='<SMSMsg>13900239223$break$13916809666$break$天之道损有余而补不足,是故虚胜实,不足胜有余$break$-YYFA';
len:=length(SendStr);
TmpStr.Write(len,sizeof(integer));
TmpStr.Write(SendStr[1],length(SendStr));
self.ClientSocket1.Socket.SendStream(TmpStr) ;
TmpStr.Free;
end;


试试这个
如果不行在发送之前加个TmpStr.Position:=0;试试
 
另外最好发之前把len转换成网络格式
 
to ghb1974
len转换成网络格式怎么做?
 
不要发什么动态数组,自己控制协议,比如
intarra:array of integer;
可以这样
先把长度发过去,后面把所有的数据放在后面发过去。
 
无忌哥哥的意思是不是分两次发啊?
如果不是的话,您能不能告诉我怎么把两个不同数据类型拼起来啊?
因为字符串长度是不定的,所以不能定结构的
 
那位大哥帮帮忙拉
 
同意无忌的办法,他的意思就是把码长和代码一起发,但是信息要素要自己定义。这样才能识别嘛,随便说说
 
难道非要定结构才行吗?
 
后退
顶部