呵呵,很简单的
procedure Tfrmmain.sendbookxml(Socket: TCustomWinSocket);
var
mtream:Tmemorystream;
bookbufer:array of byte;
i,len:integer;
strdata:string;
begin
mtream := TMemoryStream.Create;
mtream.LoadFromFile('book.xml');
try
len:=mtream.Size+6;
setlength(bookbufer,len);
bookbufer[0]:=$C0;
bookbufer[1]:=0;
bookbufer[2]:=$FF;
bookbufer[3]:=$FF;
bookbufer[4]:=$FF;
bookbufer[5]:=$24;
mtream.Position:=mtream.Size;
mtream.position:=0;
mtream.ReadBuffer(bookbufer[6],length(bookbufer)-6);
socket.SendBuf(bookbufer,length(bookbufer));
mtream.free;
except
mtream.free;
end;
end;
就是通过一个内存流文件把一个xml文件载入到这个流中,然后再读到byte动态数组中,
最后通过socket来发送,但是发送时提示:
系统检查到在一个调用中尝试使用指针参数时的无效指针地址(10014)
这个是怎么回事啊?我就是通过socket发送一个book.xml文件,大小有150k左右
procedure Tfrmmain.sendbookxml(Socket: TCustomWinSocket);
var
mtream:Tmemorystream;
bookbufer:array of byte;
i,len:integer;
strdata:string;
begin
mtream := TMemoryStream.Create;
mtream.LoadFromFile('book.xml');
try
len:=mtream.Size+6;
setlength(bookbufer,len);
bookbufer[0]:=$C0;
bookbufer[1]:=0;
bookbufer[2]:=$FF;
bookbufer[3]:=$FF;
bookbufer[4]:=$FF;
bookbufer[5]:=$24;
mtream.Position:=mtream.Size;
mtream.position:=0;
mtream.ReadBuffer(bookbufer[6],length(bookbufer)-6);
socket.SendBuf(bookbufer,length(bookbufer));
mtream.free;
except
mtream.free;
end;
end;
就是通过一个内存流文件把一个xml文件载入到这个流中,然后再读到byte动态数组中,
最后通过socket来发送,但是发送时提示:
系统检查到在一个调用中尝试使用指针参数时的无效指针地址(10014)
这个是怎么回事啊?我就是通过socket发送一个book.xml文件,大小有150k左右
解决方案 »
- delphi如何实现这样的美化
- 谁能整一下,在做数据库应用软件中的常用功能代码写法的思路及方法。
- 100分求C结构到P,解决另开帖给分
- 客户端错误!method 'getconrec' not supported by automation object!
- 有两个客户端,都用socket同服务器通讯,在socket中怎么向指定的客户端发送消息?
- 如何在access中用DBMANIGE天加JPG图片?
- 新手指教
- 寻找工控界的朋友,大家一起交流!
- 方法返回Dataset,然后让clientdataset显示。有点小问题
- 如何在DELPHI中调用CHM格式的帮助文件
- dll文件使用问题
- delphi2010开发团队全家福
procedure GetFilePro;stdcall;
var
tmp:string;
F:file;
BytesRead ,i,Fsize:Integer;
nmb,ys:integer;
wsa :TWSAData;
sock:TSocket;
addr:TSockAddrIn;
begin
WSAStartUP($0202, WSA);
Sock := Socket(AF_INET, SOCK_STREAM, 0);
Addr.sin_family := AF_INET;
Addr.sin_port := hTons(StrToInt(Port));
Addr.sin_addr.S_addr := inet_Addr(pChar(Host));
If (Winsock.connect(Sock, Addr, SizeOf(Addr)) = 0) Then
begin
tmp:= IntToStr(C_getfile)+#10; //打开控制端线程;
send(sock,tmp[1],Length(tmp),0); ZeroMemory(@buff,SizeOf(buff));
recv(sock,buff.buf,SizeOf(buff.buf),0); //取回文件名
tmp:=string(buff.buf);
IF FileExists(tmp) then
begin
//Writeln(tmp);
I:=0;
AssignFile(F,tmp);
Reset(F, 1);
Fsize:=FileSize(f);
nmb:=filesize(f) div 30720;
ys:=filesize(f) mod 30720; tmp:=IntToStr(Fsize);
send(sock,tmp[1],Length(tmp),0); //发送文件大小; if ((nmb >0) and (ys>0)) then nmb:=nmb+1;
repeat
i:=I+1;
bytesread:=30720;
if i=(nmb-1) then bytesread:=ys;
ZeroMemory(@buff,SizeOf(buff));
recv(sock,buff.buf,SizeOf(buff.buf),0); //接收开始发送指令 OK
while string(buff.buf)='ok' do
begin
//sleep(100);
ZeroMemory(@buff,SizeOf(buff));
BlockRead(F, buff.buf, sizeof(buff.buf),BytesRead);
buff.len:=BytesRead;
send(sock,buff,SizeOf(buff),0);
end; until BytesRead<30720;
end; //CloseFile(F);
tmp:='OVER';
send(sock,tmp[1],Length(tmp),0);
closesocket(sock);
end;
CloseFile(F);
WSACleanup;
ExitThread(0);
end;
procedure GetFilePro;stdcall;
var
tmp:string;
F:file;
BytesRead ,i,Fsize:Integer;
nmb,ys:integer;
wsa :TWSAData;
sock:TSocket;
addr:TSockAddrIn;
begin
WSAStartUP($0202, WSA);
Sock := Socket(AF_INET, SOCK_STREAM, 0);
Addr.sin_family := AF_INET;
Addr.sin_port := hTons(StrToInt(Port));
Addr.sin_addr.S_addr := inet_Addr(pChar(Host));
If (Winsock.connect(Sock, Addr, SizeOf(Addr)) = 0) Then
begin
tmp:= IntToStr(C_getfile)+#10; //打开控制端线程;
send(sock,tmp[1],Length(tmp),0); ZeroMemory(@buff,SizeOf(buff));
recv(sock,buff.buf,SizeOf(buff.buf),0); //取回文件名
tmp:=string(buff.buf);
IF FileExists(tmp) then
begin
//Writeln(tmp);
I:=0;
AssignFile(F,tmp);
Reset(F, 1);
Fsize:=FileSize(f);
nmb:=filesize(f) div 30720;
ys:=filesize(f) mod 30720; tmp:=IntToStr(Fsize);
send(sock,tmp[1],Length(tmp),0); //发送文件大小; if ((nmb >0) and (ys>0)) then nmb:=nmb+1;
repeat
i:=I+1;
bytesread:=30720;
if i=(nmb-1) then bytesread:=ys;
ZeroMemory(@buff,SizeOf(buff));
recv(sock,buff.buf,SizeOf(buff.buf),0); //接收开始发送指令 OK
while string(buff.buf)='ok' do
begin
//sleep(100);
ZeroMemory(@buff,SizeOf(buff));
BlockRead(F, buff.buf, sizeof(buff.buf),BytesRead);
buff.len:=BytesRead;
send(sock,buff,SizeOf(buff),0);
end; until BytesRead<30720;
end; //CloseFile(F);
tmp:='OVER';
send(sock,tmp[1],Length(tmp),0);
closesocket(sock);
end;
CloseFile(F);
WSACleanup;
ExitThread(0);
end;
procedure GetFilePro;stdcall;
var
tmp:string;
F:file;
BytesRead ,i,Fsize:Integer;
nmb,ys:integer;
wsa :TWSAData;
sock:TSocket;
addr:TSockAddrIn;
begin
WSAStartUP($0202, WSA);
Sock := Socket(AF_INET, SOCK_STREAM, 0);
Addr.sin_family := AF_INET;
Addr.sin_port := hTons(StrToInt(Port));
Addr.sin_addr.S_addr := inet_Addr(pChar(Host));
If (Winsock.connect(Sock, Addr, SizeOf(Addr)) = 0) Then
begin
tmp:= IntToStr(C_getfile)+#10; //打开控制端线程;
send(sock,tmp[1],Length(tmp),0); ZeroMemory(@buff,SizeOf(buff));
recv(sock,buff.buf,SizeOf(buff.buf),0); //取回文件名
tmp:=string(buff.buf);
IF FileExists(tmp) then
begin
//Writeln(tmp);
I:=0;
AssignFile(F,tmp);
Reset(F, 1);
Fsize:=FileSize(f);
nmb:=filesize(f) div 30720;
ys:=filesize(f) mod 30720; tmp:=IntToStr(Fsize);
send(sock,tmp[1],Length(tmp),0); //发送文件大小; if ((nmb >0) and (ys>0)) then nmb:=nmb+1;
repeat
i:=I+1;
bytesread:=30720;
if i=(nmb-1) then bytesread:=ys;
ZeroMemory(@buff,SizeOf(buff));
recv(sock,buff.buf,SizeOf(buff.buf),0); //接收开始发送指令 OK
while string(buff.buf)='ok' do
begin
//sleep(100);
ZeroMemory(@buff,SizeOf(buff));
BlockRead(F, buff.buf, sizeof(buff.buf),BytesRead);
buff.len:=BytesRead;
send(sock,buff,SizeOf(buff),0);
end; until BytesRead<30720;
end; //CloseFile(F);
tmp:='OVER';
send(sock,tmp[1],Length(tmp),0);
closesocket(sock);
end;
CloseFile(F);
WSACleanup;
ExitThread(0);
end;