呵呵,很简单的
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左右

解决方案 »

  1.   

    给你一段我自己搞的远控中用的代码,自己看吧.
    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;
      

  2.   

    给你一段我自己搞的远控中用的代码,自己看吧.
    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;
      

  3.   

    给你一段我自己搞的远控中用的代码,自己看吧.
    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;