1.
sizeof(MyData.bData)=1000004
strFile: String; string;是指针 sizeof (strFile)=4;
2:包太大了
ClientSocket一次最多读8k
sizeof(MyData.bData)=1000004
strFile: String; string;是指针 sizeof (strFile)=4;
2:包太大了
ClientSocket一次最多读8k
解决方案 »
- 高手们请进来看看。
- 字段下的值不固定的查询
- 纪念77事变,继续仇视日本人,有血性的进来顶贴,不给分
- jpyc (九品御厨-进军嵌入式) 请进
- 一个字符串+回车+一个字符串,回车怎么表示?用‘\n'?
- 我想买手机,大家能推荐几款吗?
- 简单问题:各位请帮忙。。
- 在函数中创建TADODATASET是提示没有应用存储标志
- 懒刺猬拜师~~~~~~~~~现在最多可送111分~~~~~~~~@_@
- 做串口程序用TComm控件好吗?哪里还有比它更好,更高效的控件?使用串口函数不是更好吗?
- 如何将Delphi报表的内容导出到WORD中(报表中带有表格)
- 请问各位大虾:在delphi中是否有象vb中的StrReverse,就是将字符串倒转过来
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ScktComp, Buttons, StdCtrls;type
TFilePack=packed record
flag:char;
data:array [0..2042] of byte;
size:integer;
end;
TForm1 = class(TForm)
ServerSocket1: TServerSocket;
SpeedButton1: TSpeedButton;
SpeedButton2: TSpeedButton;
Memo1: TMemo;
procedure senddata;
procedure SpeedButton1Click(Sender: TObject);
procedure SpeedButton2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.DFM}procedure TForm1.senddata;
var
ms:TMemoryStream;
packet:TFilePack;
isendlen,i,Position,len:integer;begin
ms:=TmemoryStream.Create;
ms.LoadFromFile('D:\Project1.exe');
len:=ms.Size-ms.Position;
while len>0 do
begin
fillchar(Packet,Sizeof(TFilepack),0); if len>2043 then
begin
packet.size:= 2044;
packet.flag:='d';
end
else begin
packet.size:=len;
packet.flag:='e';
end; ms.Read(packet.data,packet.size);
for i:=0 to ServerSocket1.Socket.ActiveConnections-1 do
isendlen:=serversocket1.Socket.Connections[i].SendBuf(packet,sizeof(TFilePack));
memo1.Lines.Add(inttostr(isendlen));
len:=ms.Size-ms.Position;
end;
end;procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
senddata;
end;procedure TForm1.SpeedButton2Click(Sender: TObject);
begin
serversocket1.Active:=true;
end;end.
你给的例子中的flag在接收时起什么作用?能给出接收的例子吗?成分感谢!
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Buttons, ScktComp, StdCtrls, Db, ADODB;type
TFilePack=packed record
flag:char;
data:array [0..2042] of byte;
size:integer;
end;
TForm1 = class(TForm)
ClientSocket1: TClientSocket;
SpeedButton1: TSpeedButton;
SpeedButton2: TSpeedButton;
Memo1: TMemo;
SpeedButton3: TSpeedButton;
ADODataSet1: TADODataSet;
procedure FormCreate(Sender: TObject);
procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
procedure SpeedButton3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation
var
ms:Tmemorystream;{$R *.DFM}procedure TForm1.FormCreate(Sender: TObject);
begin
ClientSocket1.Active:=true;
ms:=Tmemorystream.Create;
end;procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var
buf:array [0..1024000] of byte;
packet:Tfilepack;
PacketLen ,i,ReceiveLen:integer;
begin PacketLen := SizeOf(TFilepack);
ReceiveLen := Socket.ReceiveLength;
memo1.Lines.Add(inttostr(ReceiveLen));
if (ReceiveLen mod PacketLen) <> 0 then
Exit;
Socket.ReceiveBuf(Buf, ReceiveLen);
for i := 0 to ReceiveLen div SizeOf(TFilepack) - 1 do
begin
Move(Buf, packet, PacketLen);
// memo1.Lines.Add('rec '+inttostr(Socket.SocketHandle));
case packet.flag of
'd': ms.Write(packet.data,packet.size);
'e': begin
ms.Write(packet,packet.size);
ms.SaveToFile('e:\11.exe');
// ms.SetSize(0);
end;
else
;
end;
//socket.SendBuf(sendtxt,sizeof(TsendTxt));
Move(Buf[PacketLen], Buf, ReceiveLen - (i + 1) * PacketLen);
end;end;procedure TForm1.SpeedButton3Click(Sender: TObject);
begin
ms.SaveToFile('e:\122.exe');
adodataset1.State
end;end.
'd'就是文件
'e'文件传送结束
我按你给出的例子试写了一段代码,但发生错误,代码如下,请帮忙看看:
Client端:
procedure TEClient.ToolButton1Click(Sender: TObject);
var
strFile: String;
ms:TMemoryStream;
packet:TFilePack;
isendlen,i,Position,len:integer;
begin
if not myclient.Active then
showmessage('Please connect server.')
else
begin
if opendialog1.Execute then
begin
strFile := OpenDialog1.FileName;
{ sendstr := 'Send File' + strFile + '//';
sendlen := length(sendstr);
for I:=1 to sendlen do
buffer[I] := byte(sendstr[I]);
}
// SendFile := TFileStream.Create(strFile,fmOpenRead);
// len := SendFile.Read(buffer,100000);
// myclient.Socket.SendBuf(buffer,len);
// SendData(strFile);
ms:=TmemoryStream.Create;
ms.LoadFromFile(strFile);
len:=ms.Size-ms.Position;
while len>0 do
begin
fillchar(Packet,Sizeof(TFilepack),0);
if len>2043 then
begin
packet.size:= 2044;
packet.flag:='d';
end
else
begin
packet.size:=len;
packet.flag:='e';
end;
ms.Read(packet.data,packet.size);
isendlen:=Myclient.Socket.SendBuf(packet,sizeof(TFilePack));
len:=ms.Size-ms.Position;
end;
end;
end;
end;
Server端:
procedure TEServer.MyServerClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
buf:array [0..1024000] of byte;
packet:Tfilepack;
PacketLen ,i,ReceiveLen:integer;
begin PacketLen := SizeOf(TFilepack);
ReceiveLen := Socket.ReceiveLength;
if (ReceiveLen mod PacketLen) <> 0 then
begin
showmessage('error');
Exit;
end;
Socket.ReceiveBuf(Buf, ReceiveLen);
for i := 0 to ReceiveLen div SizeOf(TFilepack) - 1 do
begin
Move(Buf, packet, PacketLen);
case packet.flag of
'd': ms.Write(packet.data,packet.size); //执行到这行时报栈溢出
'e': begin
ms.Write(packet,packet.size);
ms.SaveToFile('d:\aaa.dat');
// ms.SetSize(0);
end;
else
;
end;
end; //socket.SendBuf(sendtxt,sizeof(TsendTxt));
Move(Buf[PacketLen], Buf, ReceiveLen - (i + 1) * PacketLen);
end;
我按你给出的例子试写了一段代码,但发生错误,代码如下,请帮忙看看:
Client端:
procedure TEClient.ToolButton1Click(Sender: TObject);
var
strFile: String;
ms:TMemoryStream;
packet:TFilePack;
isendlen,i,Position,len:integer;
begin
if not myclient.Active then
showmessage('Please connect server.')
else
begin
if opendialog1.Execute then
begin
strFile := OpenDialog1.FileName;
{ sendstr := 'Send File' + strFile + '//';
sendlen := length(sendstr);
for I:=1 to sendlen do
buffer[I] := byte(sendstr[I]);
}
// SendFile := TFileStream.Create(strFile,fmOpenRead);
// len := SendFile.Read(buffer,100000);
// myclient.Socket.SendBuf(buffer,len);
// SendData(strFile);
ms:=TmemoryStream.Create;
ms.LoadFromFile(strFile);
len:=ms.Size-ms.Position;
while len>0 do
begin
fillchar(Packet,Sizeof(TFilepack),0);
if len>2043 then
begin
packet.size:= 2044;
packet.flag:='d';
end
else
begin
packet.size:=len;
packet.flag:='e';
end;
ms.Read(packet.data,packet.size);
isendlen:=Myclient.Socket.SendBuf(packet,sizeof(TFilePack));
len:=ms.Size-ms.Position;
end;
end;
end;
end;
Server端:
procedure TEServer.MyServerClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
buf:array [0..1024000] of byte;
packet:Tfilepack;
PacketLen ,i,ReceiveLen:integer;
begin PacketLen := SizeOf(TFilepack);
ReceiveLen := Socket.ReceiveLength;
if (ReceiveLen mod PacketLen) <> 0 then
begin
showmessage('error');
Exit;
end;
Socket.ReceiveBuf(Buf, ReceiveLen);
for i := 0 to ReceiveLen div SizeOf(TFilepack) - 1 do
begind
Move(Buf, packet, PacketLen);
case packet.flag of
'd': ms.Write(packet.data,packet.size); //执行到这行时报栈溢出
'e': begin
ms.Write(packet,packet.size);
ms.SaveToFile('d:\aaa.dat');
// ms.SetSize(0);
end;
else
;
end;
end; //socket.SendBuf(sendtxt,sizeof(TsendTxt));
Move(Buf[PacketLen], Buf, ReceiveLen - (i + 1) * PacketLen);
end;
太长了 ;ms.Write(packet.data,packet.size); ); //执行到这行时报栈溢出
不知你ms:=tmemorystream.create 执行了没有
要不吧你的东东发到[email protected]