请各位帮手看看以下代码哪里有问题(导致连接中断)?function send_data(data_send:in_data):boolean; var this_connect:connect; stream:TMemoryStream; fs:tfilestream; begin this_connect:=find_id(data_send.con_id); if this_connect.thread_id>0 then begin { type data_record=record con_code:smallint;//操作码 con_id:integer;//发送目的id号 mess_len:integer;//消息长度 file_size:int64;//文件长度 name_size:smallint;//文件名的长度 filename:string;//文件名 mess:string;//消息体,文本格式 end; } stream:=TMemoryStream.Create; stream.WriteBuffer(data_send.con_code,sizeof(data_send.con_code)); stream.WriteBuffer(data_send.con_id,sizeof(data_send.con_id)); data_send.mess_len:=length(data_send.mess); stream.WriteBuffer(data_send.mess_len,sizeof(data_send.mess_len)); stream.WriteBuffer(data_send.mess[1],data_send.mess_len); if fileexists(data_send.filename) then begin data_send.name_size:=length(data_send.filename); fs:=tfilestream.Create(data_send.filename,fmopenread); data_send.file_size:=fs.Size; stream.WriteBuffer(data_send.file_size,sizeof(data_send.file_size));//发送文件大小 stream.WriteBuffer(data_send.name_size,sizeof(data_send.name_size));//发送文件名大小 stream.WriteBuffer(data_send.filename[1],data_send.name_size);//发送文件名 stream.WriteBuffer(fs,data_send.file_size);//发送文件体 fs.Free; end else begin data_send.file_size:=0; stream.WriteBuffer(data_send.file_size,sizeof(data_send.file_size));//发送文件大小0 end; this_connect.objects.Connection.WriteStream(stream,true,true); stream.Free; result:=true; end else result:=false; end;
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ScktComp, StdCtrls; type
TForm1 = class(TForm)
ClientSocket1: TClientSocket;
ServerSocket1: TServerSocket;
btnTestSockets: TButton;
procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure ClientSocket1Disconnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
procedure ServerSocket1ClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure btnTestSocketsClick(Sender: TObject);
private
FStream: TFileStream;
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end; var
Form1: TForm1; implementation {$R *.dfm} procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var
iLen: Integer;
Bfr: Pointer;
begin
iLen := Socket.ReceiveLength;
GetMem(Bfr, iLen);
try
Socket.ReceiveBuf(Bfr^, iLen);
FStream.Write(Bfr^, iLen);
finally
FreeMem(Bfr);
end;
end; procedure TForm1.FormCreate(Sender: TObject);
begin
FStream := nil;
end; procedure TForm1.FormDestroy(Sender: TObject);
begin
if Assigned(FStream) then
begin
FStream.Free;
FStream := nil;
end;
end; procedure TForm1.ClientSocket1Disconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
if Assigned(FStream) then
begin
FStream.Free;
FStream := nil;
end;
end; procedure TForm1.ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
begin
FStream := TFileStream.Create('c:\temp\test.stream.html', fmCreate or fmShareDenyWrite);
end; procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
Socket.SendStream(TFileStream.Create('c:\temp\test.html', fmOpenRead or fmShareDenyWrite));
end; procedure TForm1.btnTestSocketsClick(Sender: TObject);
begin
ServerSocket1.Active := True;
ClientSocket1.Active := True;
end; end.
我刚入门不久,看了以上回复,还不能解决,请再多多赐教!
比方以下数据结构在:
type data=record
id:smallint;
mess:string[80];
filename:string[40];//里面存放的为要交换的文件名(包括路径)
end;
帮忙写一个打包发送与接收分解的过程。
我会尽快结贴!先谢为敬!!!
var
this_connect:connect;
stream:TMemoryStream;
fs:tfilestream;
begin
this_connect:=find_id(data_send.con_id);
if this_connect.thread_id>0 then
begin
{
type
data_record=record
con_code:smallint;//操作码
con_id:integer;//发送目的id号
mess_len:integer;//消息长度
file_size:int64;//文件长度
name_size:smallint;//文件名的长度
filename:string;//文件名
mess:string;//消息体,文本格式
end;
}
stream:=TMemoryStream.Create;
stream.WriteBuffer(data_send.con_code,sizeof(data_send.con_code));
stream.WriteBuffer(data_send.con_id,sizeof(data_send.con_id)); data_send.mess_len:=length(data_send.mess);
stream.WriteBuffer(data_send.mess_len,sizeof(data_send.mess_len));
stream.WriteBuffer(data_send.mess[1],data_send.mess_len); if fileexists(data_send.filename) then
begin
data_send.name_size:=length(data_send.filename);
fs:=tfilestream.Create(data_send.filename,fmopenread);
data_send.file_size:=fs.Size; stream.WriteBuffer(data_send.file_size,sizeof(data_send.file_size));//发送文件大小
stream.WriteBuffer(data_send.name_size,sizeof(data_send.name_size));//发送文件名大小
stream.WriteBuffer(data_send.filename[1],data_send.name_size);//发送文件名
stream.WriteBuffer(fs,data_send.file_size);//发送文件体
fs.Free;
end
else
begin
data_send.file_size:=0;
stream.WriteBuffer(data_send.file_size,sizeof(data_send.file_size));//发送文件大小0
end; this_connect.objects.Connection.WriteStream(stream,true,true);
stream.Free;
result:=true;
end
else
result:=false;
end;
stream.WriteBuffer(data_send, REC_SIZE);(注:一個数据结构record、一斉装入如何?)
文件不能一齐装入传送的!