var
Receiving: Boolean; //是否在接收文件
Buff: Point;
RealCount: Integer; //当前发送位置
Const
 DataSize = 4096;//每次发送的字节数
发送的代码
 IF Socket.ReceiveText = 'Ready To Receive Next' then
 begin
  GetMem(Buff,DataSize);
  RealCount := SendFileStream.Read(Buff^,DataSize);
  ClientSocket_SendFile.Socket.Sendbuf(Buff^,RealCount);
 end;接收代码
 IF Not Receiving then
  ReceiveFileStream := TFileStream.Create('C:\'+ReceiveFileName,fmCreate and fmOpenWrite); Receiving := True;
 Getmem(Buff,DataSize);
 RealCount := Socket.ReceiveBuf(Buff^,DataSize);
 ReceiveFileStream.WriteBuffer(Buff^,RealCount);
 FreeMem(Buff);
 ServerSocket_SendFile.Socket.Connections[0].SendText('Ready To Receive Next');运行时出现这样问题:在接收到第一个数据后,反馈给发送方让发送方继续发送第二个数据
可是第儿个数据发送过来后,执行 ReceiveFileStream.WriteBuffer(Buff^,RealCount);语句程序
就会出错,提示是:Access violation at address 0041B4E5 in moudle 'xxx.exe'.Read of 
address B883665F.
试过好多方法就是不行,请各位赐教啊,只有10分了,请各位高台贵手

解决方案 »

  1.   

    接收代码存在着一个比较严重的问题:如果RealCount < DataSize, 则就会出现发送方只发了一个DataSize的数据包, 而接收方却回复了多个'Ready To Receive Next'。至于你所说的现象是否与上面的问题有关,目前还不太清楚。
      

  2.   

    iLength:=Socket.ReceiveLength;
       GetMem(bufRecv,iLength);
       FreeMem(Buff); //把这句去掉  var
       iLength:integer;
    接收代码
     IF Not Receiving then
      ReceiveFileStream := TFileStream.Create('C:\'+ReceiveFileName,fmCreate and fmOpenWrite); Receiving := True;
     iLength:=Socket.ReceiveLength;
     GetMem(bufRecv,iLength);
     try
         RealCount := Socket.ReceiveBuf(Buff^,iLength);
         ReceiveFileStream.WriteBuffer(Buff^,iLength);
     finally
         FreeMem(Buff);
     end;
         ServerSocket_SendFile.Socket.Connections[0].SendText('Ready To Receive Next');