传送端:
procedure Tf_Main.rb_upClick(Sender: TObject);
var
  nID:integer;
  nSize:Integer;
  n:Integer;
  p:pByte;
  data:TmemoryStream;
begin
data:=TmemoryStream.Create;
   try
      data.LoadFromFile(extractfilepath(application.EXEName)+'xfd.tmp');
      with ClientSocket1 do
      begin
           open;
           nSize:=data.Size;
           p:=data.Memory;
           while (nSize>0) do
           begin
                n:=nSize;
                if (n>8192) then
                    n:=8192;
                n:=Socket.SendBuf(p^,n);
                //
                if (n<=0) then
                  Raise Exception.Create('发送文件失败!');
                Inc(p,n);
                Dec(nSize,n);
           end;
           close;
      end;
   except on e:Exception do
            showmessage(e.Message);
   end;
    data.Free;
end;接收端:
procedure Tf_Server.ServerSocket1Accept(Sender: TObject;
  Socket: TCustomWinSocket);
var
  nID:integer;
  nSize:Integer;
  n:Integer;
  p:pByte;
  data:TmemoryStream;
begin
   data:=TmemoryStream.Create;
   GetMem(p,8192);
   try
      while (nSize>0) do
      begin
          n:=nSize;
          if (n>8192) then
              n:=8192;
          n:=Socket.ReceiveBuf(P^,n);
          if (n<=0) then
              Raise Exception.Create('');
          data.Write(p^,n);
          Dec(nSize,n);
      end;
      data.SaveToFile(extractfilepath(application.EXEName)+'xfd.tmp');
   except
   end;
   FreeMem(p);
   data.Free;
end;每次都是提示:发送文件失败!

解决方案 »

  1.   

    我采用的TServerSocket/TClientSocket,其中TServerSocket的ServerType:=stThreadBlocking;
    TClientSocket的ClientType:=ctBlocking;ClientSocket能正确连接到ServerScoket如果在n:=Socket.SendBuf(p^,n);后加上showmessage(inttostr(n));需要每次点击对话框,最终是可以正常接收的我不知道问题出在哪儿,请各位大侠指点一下
      

  2.   

    data.LoadFromFile(extractfilepath(application.EXEName)+'xfd.tmp');
    后加上:
    data.Position := 0;
      

  3.   

    注:
    不是我没有发送文件大小,是我复制代码时没复制全
               nSize:=data.Size;
               if (socket.SendBuf(nSize,SizeOf(nSize)) <> SizeOf(nSize)) then
                  Raise Exception.Create('发送文件大小错误!');
               p:=data.Memory;
    其实我的代码是按照delphi6高级编程中的例程输入的,我所迷惑的是:
    如果在n:=Socket.SendBuf(p^,n);后加上showmessage(inttostr(n));需要每次点击对话框,最终是可以正常接收的