1.delphi的TClientSocket是不是基于TCP协议的?2.能否发送二进制数据?
type
  TRec=packed record 
    i:integer;
    c:char;
    s:string;
    b:boolean;
  end;
var
rec:trec;
begin
rec.i:=0;
rec.b:=false;clientsocket.socket.sendbuffer(rec,sizeof(rec));
end;这样是否可以?是不是基于tcp协议的onclientwrite的激发条件是判断是否受到的字节数和事先发来的count比较才产生的?就是说sizeof(rec)的作用之一就是告诉接受方收到多少字节就算结束了?3.如果tcp协议是这样,那么udp呢?
使用udp协议接收信息的时候判断是否接受完毕的标准也是有个count?
唯一的不同就是udp协议接受信息的“无序性”?

解决方案 »

  1.   

    那么UDP的一个信息单元是多大?8k?
      

  2.   

    TClientSocket是基于TCP协议的,示例:
    procedure TFM_DL_CLT.cstCLTRead(Sender: TObject; Socket: TCustomWinSocket);
    var
      pvbuf: Pointer;
      isize,irealsize: Integer;
      sTemp: String;
    begin
      try
        isize := Socket.ReceiveLength;
        GetMem(pvbuf, isize);
    0A    irealsize := Socket.ReceiveBuf(pvbuf^,isize);
        sTemp := PChar(pvbuf);
        sTemp := Copy(Trim(sTemp),1,irealsize);
        if (sTemp = 'AskForFilePathName') then
        begin
          Socket.SendText(RemoteFilePathName);
        end else if (sTemp = 'FileNameGot') then
        begin
          Socket.SendText('AskForFileLength');
        end else if (Copy(sTemp,1,6) = 'Length') then
        begin
          FileLength := StrToInt(Copy(sTemp,7,Length(sTemp)-6));
          prgRate := ggCopy.MaxValue / FileLength;
          Socket.SendText('AskForFile');
        end else if (sTemp = 'End') then
        begin
          cstCLT.Close;
          FreeAndNil(DSFile);
    0A      lbNote.Caption := '下载完毕,更新文件吗?';
          ggCopy.Progress := ggCopy.MaxValue;
          btCommit.Visible := true;
          btCancel.Visible := true;
        end else
        begin
          Socket.SendText('AskForFile');
          Inc(FileLengthCurr,DSFile.Write(pvbuf^,irealsize));
          ggCopy.Progress := Round(prgRate * FileLengthCurr);
          {if (FileLengthCurr >= FileLength) then   //理论上可行
          begin
            FreeAndNil(DSFile);
            cstCLT.Close;
            lbNote.Caption := '下载完毕,更新文件吗?';
            btCommit.Visible := true;
            btCancel.Visible := true;
          end;}
        end;
      finally
        FreeMem(pvbuf);
      end;
    end;她的读写事件和服务端是否多线程运行有关系。
    —————————————————————————————————
    MaximStr := '宠辱不惊,看庭前花开花落,去留无意;
                 毁誉由人,望天上云卷云舒,聚散任风。';
    if Not Assigned(I) then
      I := TI.Create(Nil);
    I.Maxim := MaximStr;
    I.Explain := '假如上述代码中出现“OA”等字样,删除它们';
    I.Desire := '加不加分随你';
    —————————————————————————————————
           
      

  3.   

    感谢: lxpbuaa,
    那么另外两个问题呢?
      

  4.   

    还有个疑惑,看如下:
    type
      TREC=packed record
        i:integer;
        d:double;
        c:char;
      end;
    var
    l:integer;
    p:pointer;
    rec:trec;
    begin
    getmem(p,sizeof(rec));
    l:=client1.socket.receivelength;
    showmessage('');client1.socket.recievebuffer(p,l);
    ...
    freemem(p);
    end;
    //为什么加上showmessage会出错呢?
      

  5.   

    还有个疑惑,看如下:
    type
      TREC=packed record
        i:integer;
        d:double;
        c:char;
      end;
    var
    l:integer;
    p:pointer;
    rec:trec;
    begin
    getmem(p,sizeof(rec));
    l:=client1.socket.receivelength;
    showmessage('');client1.socket.recievebuffer(p,l);
    ...
    freemem(p);
    end;
    //为什么加上showmessage会出错呢?
      

  6.   

    if u socket procedure in a unit without form, then
    u can't use showmessage!
      

  7.   

    yes,my socket procedure is in a unit with a form!
      

  8.   

    I did not mean the showmessage procedure itself, i want to know why the socket does not work well when i show a message between getlength and readbuffer.