如何将string转成pchar?(50分)

  • 主题发起人 younghat
  • 开始时间
Y

younghat

Unregistered / Unconfirmed
GUEST, unregistred user!
使用TWinSocketStream进行同步数据交换,代码如下:
var
SocketStream:TWinSocketStream;
buf:array[0..10000] of char;
timeout,i:integer;
begin
timeout:=5000;
StrPCopy(buf,Memo1.Text);
SocketStream:=TWinSocketStream.Create(self.ClientSocket1.Socket,timeout);
SocketStream.Write(buf,timeout);
SocketStream.WaitForData(timeout);
……
end;
问题是,实际传送的内容长度不能确定,即使我用buf:array[0..1000000] of char;也无法保证长度不会超过。
我该怎么办,各位大侠救我。
 
分多次接收,每次接收8K
 
把MEMO1.TEXT拆分如何?
 
好像没看懂
SocketStream.Write(PChar(Memo1.Text), timeout);
 
用循环
使用TWinSocketStream进行同步数据交换,代码如下:
var
SocketStream:TWinSocketStream;
buf:array[0..10000] of char;
timeout,i:integer;
begin
timeout:=5000;
SocketStream:=TWinSocketStream.Create(self.ClientSocket1.Socket,timeout);
for i :=0 to memo1.lines.count-1 do
begin
StrPCopy(buf,Memo1.lines.Text);
SocketStream.Write(buf,timeout);
end;
SocketStream.WaitForData(timeout);
……
end;
 
定量传输,定量接收
 
savetime你好,你说的方法我一开始就试了,但是不行,比如:
var buf:pchar;
……
buf:=pchar(Memo1.Text);
SocketStream.Write(buf,timeout);
……
语法能通过,但是对方接收到的内容成了乱码。
 
下面的代码你可以参考一下,主要是csFile部分

private
Buffer:array[0..9999] of char

procedure TFrm_Sf_Bbjs.SerSockClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
StrIn:string;
B_stream:TmemoryStream;
B_StrLen,B_position:integer;
Time1:cardinal;
begin
case SerStatus of
csIdle:
begin
Socket.ReCeiveBuf(Buffer,6);
Strin:=Copy(Buffer,1,6);
if Copy(Strin,1,4)='WJJS' then
begin
SerStatus:=CsLeng;
B_FileLen:=StrToInt(Copy(Strin,5,2));
end;
end;
csLeng:
begin
Socket.ReceiveBuf(Buffer,B_FileLen);
Strin:=Copy(Buffer,1,B_FileLen);
if copy(Strin,1,2)='Db' then
begin
SerStatus:=csFile;
B_CanHttp:=False;
Lsb_Js.Items.Add('正在接收文件'+StrIn+'... '+TimeToStr(Time));
end;
end;
csFile: //主要是看这一部分的代码
begin
B_Stream:=TMemoryStream.Create;
B_position:=10000;
While True do
begin
while Socket.ReceiveLength<10000 do
begin
if Socket.ReceiveLength=B_position then break;
B_position:=Socket.ReceiveLength
Time1:=GetTickCount;
While GetTickCount-Time1<200 do;
end;
B_StrLen:=Socket.ReceiveBuf(Buffer,Sizeof(Buffer));
if B_StrLen<=0 then
break
else B_Stream.Write(Buffer,B_StrLen);
end;
B_Stream.Position:=0;
B_Stream.SaveToFile(ExtractFilePath(Application.ExeName)+'Dbbb.mdb');
Lsb_Js.Items.Add('文件接收结束,正在保存文件... '+TimeToStr(Time));
B_Stream.Free;
SerStatus:=CsIdle;
Socket.SendText('RECOK!');
B_CanHttp:=True;
if copy(Strin,1,4)='Dbbb' then P_SaveSj
else P_SaveFile;
end;
end;
end;
 
pchar(sstr);
 
成了乱码不应是PChar()转换的问题
 
老兄,我们现在都用socket
超过1024个字节,应该将数据分包传,否则数据太长
 
》》buf:=pchar(Memo1.Text);
》》SocketStream.Write(buf,timeout);
》》语法能通过,但是对方接收到的内容成了乱码。

如果你的TMemo1.Text大于8192字节的话,也就是说,你只收一次是收不完的
而Pchar指向零结尾字符串,如果找不到尾巴,当然是乱的
 
up,

用循环,
分段分送
 
多人接受答案了。
 
顶部