如何通过winsock把一个包含动态数组的记录从一方发送到另一方 记录如下:TUserInfo = packed record ID: array of Integer; Name: array of string;end; 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 希望下面的代码对你有所帮助:这是我做一个断点续传程序的服务断程序的服务端的部分代码。 TMultiThread = class(TServerClientThread) constructor Create(CreateSuspended: Boolean; ASocket: TServerClientWinSocket); procedure ClientExecute;override; //destructor Destroy;override; end; SegInfo = packed record //信息 RequstSendCommand:array[0..500] of char;//要求发送文件 FileName : array[0..500] of Char;//文件名 FileSize : int64;//文件大小 FileSendComplete:array[0..500] of char;//发送完毕命令 end;var frmServer: TfrmServer; hTempFile : THandle; CSocket : TServerClientWinSocket; objSegInfo : SegInfo; UserHost:String;implementationuses unt_Method;{$R *.DFM}{*************************************************************** * 方 法 名 : TfrmServer.sskProvideServerGetThread * 编写目的 : * 作 者 : 黄仁光 * 参 数 : Sender ClientSocket SocketThread * 结 果 : None * 编写日期 :2002年11月11日 ****************************************************************}procedure TfrmServer.sskProvideServerGetThread(Sender: TObject; ClientSocket: TServerClientWinSocket; var SocketThread: TServerClientThread);begin CSocket:= ClientSocket; SocketThread:= TMultiThread.Create(false,ClientSocket);end;{*************************************************************** * 方 法 名 : ClientExecute * 编写目的 : 处理与客户端的信息交流 * 作 者 : 黄仁光 * 参 数 : None * 结 果 : None * 编写日期 :2002年10月08日 ****************************************************************}procedure TMultiThread.ClientExecute;var SktStream : TWinSocketStream; f: file of Byte; FileToSendName:String; CommandSend:String;//反馈消息 SendFileSize:int64;//发送端实际发送的文件大小begin UserHost := CSocket.RemoteHost; FillChar(objSegInfo,sizeof(objSegInfo),0); SktStream:= TWinSocketStream.Create(CSocket,5000); if SktStream.WaitForData(8000) then begin SktStream.ReadBuffer(objSegInfo,sizeof(objSegInfo)); //响上传应请求 if StrPas(objSegInfo.RequstSendCommand) = '要求上传文件' then begin if Application.MessageBox(PChar('客户'+UserHost+'请求上传文件,同意吗?'),'客户请求',MB_OKCANCEL) = IDOK then begin CommandSend := '允许发送文件'; StrPCopy(objSegInfo.RequstSendCommand,CommandSend); end else begin CommandSend := '不允许发送文件'; StrPCopy(objSegInfo.RequstSendCommand,CommandSend); end end; //获取上传来的文件名 if Trim(StrPas(objSegInfo.FileName)) <> '' then begin FileToSendName := StrPas(objSegInfo.FileName); frmServer.sbrInformation.Panels.Items[1].Text := ExtractFileName(StrPas(objSegInfo.FileName)); AssignFile(f, GetFTPRoot+'\'+ExtractFileName(FileToSendName)); try Reset(f); except Application.MessageBox('文件打开错误', '提示', MB_OK); SktStream.Free; exit; end; //判断是否接收完毕 SendFileSize := objSegInfo.FileSize;//发送方所发送的文件大小,当发送方认为发送完毕时传送过来 objSegInfo.FileSize:= FileSize(f);//FileSize(f)实际接收到的文件大小,续传和完毕时要用到 if FileSize(f) = SendFileSize then begin StrPCopy(objSegInfo.FileSendComplete,'文件接收完毕'); //objSegInfo.FileSendComplete := '文件接收完毕'; frmServer.memInformation.Lines.Add('接收来自'+UserHost+'的文件完毕'); frmServer.memInformation.Lines.Add('文件名为:'+ExtractFileName(FileToSendName)); frmServer.memInformation.Lines.Add('文件大小为:'+IntToStr(SendFileSize)); end else begin frmServer.memInformation.Lines.Add(UserHost+'准备续传文件'); frmServer.memInformation.Lines.Add('续传的文件名为:'+ExtractFileName(FileToSendName)); end; CloseFile(f); end; SktStream.WriteBuffer(objSegInfo,sizeof(objSegInfo)); SktStream.Free; end;end;constructor TMultiThread.Create(CreateSuspended: Boolean; ASocket: TServerClientWinSocket);begin inherited; FreeOnTerminate:= true;end; 如何得到右键属性摘要信息 10秒之内键盘和鼠标没有任何动作 如何监控 两个问题,有关透明界面 求代码 请大家帮忙!怎样用delphi7监控带有密码的access数据库? 在Delphi中怎樣保存報表為pdf格式的文檔? 请问这个delphi写的dll函数,在VB中怎么调用? 请教ReportBuild怎么打印输出成EXCEL? 我的文件存在数据库中,如果只能从文件中取图标,我得先把文件从数据库中写到磁盘,那太耗资源了! 单步执行不会报错,不设断点就会报如下的错 这个错误提示是什么意思?有何办法克服??? dll中的函数用TDBGrid做var参数可以么
这是我做一个断点续传程序的服务断程序的服务端的部分代码。
TMultiThread = class(TServerClientThread)
constructor Create(CreateSuspended: Boolean; ASocket: TServerClientWinSocket);
procedure ClientExecute;override;
//destructor Destroy;override;
end; SegInfo = packed record //信息
RequstSendCommand:array[0..500] of char;//要求发送文件
FileName : array[0..500] of Char;//文件名
FileSize : int64;//文件大小
FileSendComplete:array[0..500] of char;//发送完毕命令
end;var
frmServer: TfrmServer;
hTempFile : THandle;
CSocket : TServerClientWinSocket;
objSegInfo : SegInfo;
UserHost:String;
implementation
uses unt_Method;{$R *.DFM}{***************************************************************
* 方 法 名 : TfrmServer.sskProvideServerGetThread
* 编写目的 :
* 作 者 : 黄仁光
* 参 数 : Sender
ClientSocket
SocketThread
* 结 果 : None
* 编写日期 :2002年11月11日
****************************************************************}
procedure TfrmServer.sskProvideServerGetThread(Sender: TObject;
ClientSocket: TServerClientWinSocket;
var SocketThread: TServerClientThread);
begin
CSocket:= ClientSocket;
SocketThread:= TMultiThread.Create(false,ClientSocket);
end;{***************************************************************
* 方 法 名 : ClientExecute
* 编写目的 : 处理与客户端的信息交流
* 作 者 : 黄仁光
* 参 数 : None
* 结 果 : None
* 编写日期 :2002年10月08日
****************************************************************}
procedure TMultiThread.ClientExecute;
var
SktStream : TWinSocketStream;
f: file of Byte;
FileToSendName:String;
CommandSend:String;//反馈消息
SendFileSize:int64;//发送端实际发送的文件大小
begin
UserHost := CSocket.RemoteHost;
FillChar(objSegInfo,sizeof(objSegInfo),0);
SktStream:= TWinSocketStream.Create(CSocket,5000);
if SktStream.WaitForData(8000) then
begin
SktStream.ReadBuffer(objSegInfo,sizeof(objSegInfo));
//响上传应请求
if StrPas(objSegInfo.RequstSendCommand) = '要求上传文件' then
begin
if Application.MessageBox(PChar('客户'+UserHost+'请求上传文件,同意吗?'),'客户请求',MB_OKCANCEL) = IDOK then
begin
CommandSend := '允许发送文件';
StrPCopy(objSegInfo.RequstSendCommand,CommandSend);
end
else
begin
CommandSend := '不允许发送文件';
StrPCopy(objSegInfo.RequstSendCommand,CommandSend);
end
end;
//获取上传来的文件名
if Trim(StrPas(objSegInfo.FileName)) <> '' then
begin
FileToSendName := StrPas(objSegInfo.FileName);
frmServer.sbrInformation.Panels.Items[1].Text := ExtractFileName(StrPas(objSegInfo.FileName));
AssignFile(f, GetFTPRoot+'\'+ExtractFileName(FileToSendName));
try
Reset(f);
except
Application.MessageBox('文件打开错误', '提示', MB_OK);
SktStream.Free;
exit;
end;
//判断是否接收完毕
SendFileSize := objSegInfo.FileSize;//发送方所发送的文件大小,当发送方认为发送完毕时传送过来
objSegInfo.FileSize:= FileSize(f);//FileSize(f)实际接收到的文件大小,续传和完毕时要用到
if FileSize(f) = SendFileSize then
begin
StrPCopy(objSegInfo.FileSendComplete,'文件接收完毕');
//objSegInfo.FileSendComplete := '文件接收完毕';
frmServer.memInformation.Lines.Add('接收来自'+UserHost+'的文件完毕');
frmServer.memInformation.Lines.Add('文件名为:'+ExtractFileName(FileToSendName));
frmServer.memInformation.Lines.Add('文件大小为:'+IntToStr(SendFileSize));
end
else
begin
frmServer.memInformation.Lines.Add(UserHost+'准备续传文件');
frmServer.memInformation.Lines.Add('续传的文件名为:'+ExtractFileName(FileToSendName));
end;
CloseFile(f);
end;
SktStream.WriteBuffer(objSegInfo,sizeof(objSegInfo));
SktStream.Free;
end;
end;constructor TMultiThread.Create(CreateSuspended: Boolean; ASocket: TServerClientWinSocket);
begin
inherited;
FreeOnTerminate:= true;
end;