传送端:
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.   

    Server端有错
    nSize没有被赋值
    加上
    nSize:=Socket.ReceiveLength;
      

  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));需要每次点击对话框,最终是可以正常接收的
      

  4.   

    那就是你的Socket.SendBuf需要一点时间加个sleep(100)之类的应该就好了Delphi的Socket有时候是有这个毛病
      

  5.   

    加在哪?我的意思是把showmessage换成sleep代码我根本没看如果按照你的说法showmessage(inttostr(n))后点击就正常了发送代码应该没问题啊或者是你的数据包太大了,或者根本是你的网络不稳定还不行的话,试着改小数据包的大小,或者让别人ping一下你看看有么有丢包