当用TClientSocket向TServerSocket发送数据时,如果发送太快的时候会令二者重叠在一起..就是将前后二个内容组成一个包接收。。像这样的情况应该怎么处理。我看了一下旧贴子。除了下面这种还有没有其他的方法呀。。
6 楼cjf1009(农民程序员)回复于 2005-07-14 10:11:18 得分 5确实会这样的,你可以这样接收   
          while   Socket.ReceiveLength<SizeOf(TBLOCK)   do   
          begin   
              application.ProcessMessages;   
          end;   
    
          Socket.ReceiveBuf(BLOCK,SizeOf(TBLOCK));   

解决方案 »

  1.   

    现在忙,要不楼主自己在下面的贴子列表当中找找看
    http://forum.csdn.net/PointForum/Forum/UserTopicList.aspx?type=TopicUserJoined&user=unsigned&sectionId=86fda20c-918f-4004-9a60-83ac6156c017
      

  2.   

    http://topic.csdn.net/u/20080129/12/6b2d0ed3-d9bc-4602-883a-3df35ea56608.html
      

  3.   

    也可以参考下面这个贴子,特别是6楼的两个辅助方法,需要注意的是那个Receive使用的时候需要注意,在数据包大,网络速度不足时,可能会产生一定的问题,建议修改对ReceiveBuf的返回值<0的判断后再增加WSAGetLastError判断是否是缓冲区数据不足,如果是的话则需要继续接收.http://topic.csdn.net/u/20081114/11/091305bd-24cf-4c5c-9083-3993e4d98eae.html
      

  4.   


    var
      ii:integer;
      Sqlstr,Sj,url:string;
      a:array of  byte;
      iLen: Integer;
    begin
      Sj:=datetimetostra;
      try
       { if Datamo.ClientSocket1.Active then
          Datamo.ClientSocket1.Socket.SendText('sdsad'); //将得到的传递给中间部门 }
        Sqlstr:='随便内容'
        iLen:=Length(Sqlstr);
        //a:=PChar(Sqlstr);
        SetLength(Sqlstr,iLen);
        if Not SendBuffer(PChar(Sqlstr),sizeof(iLen),Datamo.ClientSocket1.socket) then Exit;
    为什么另一边接收的时候是空值呢??
      

  5.   

    不好意思忘记把僵哥的代码放出来了. function SendBuffer(Buffer:Pchar;BufferLen: Integer;Socket:TCustomWinSocket):Boolean;
    var
      P: PChar;
      iLen,iSent: Integer;
    begin
      Assert(Buffer<>Nil);
      Assert(Socket<>Nil);
      Result := false;
      if Not Socket.Connected then Exit;
      P := Buffer;
      iLen := BufferLen;
      while iLen>0 do
        begin
          iSent := Socket.SendBuf(p^,iLen);
          if iSent <= 0 then Exit;
          Inc(p,iSent);
          Dec(iLen,iSent);
        end;
      Result := true;
    end;我应该怎么调用这个函数发送呀