对通讯不熟悉  ,最近在写这块,用socket 遇到了点问题。
就是在接收设备端数据时,我打算用 recv函数  可是我的包长度不定,而且有的可能很长 ,还要分包才行,请问我该怎么实现。最好是一个一个字节的接收。我接收的包也有个规律  遇到02 开始接收  遇到03 证明包结束。请各位指导!!小女子感激不尽。

解决方案 »

  1.   

    用不住一个一个字节接受吧,你可以定义一个通讯协议,有你专门数据开始的包头,比如两个字节0x01 0xac ,然后可以跟上这包数据的类型标志,比如0x01 代表A的属性 0x02 代表B的属性 再加这包数据的长度,也可以用两个字节比如255 0x00 0xff 再跟上数据字节 最后保险起见可以加CRC校验,保证数据不错。
    整个命令字节就是  01 ac 01 00 ff + 数据 + CRC 这样就不会错了,也不用一个一个接收,可以按一整包接收。 一般上位机和下位机都是按类似协议通讯。部分接收代码:var
    leng:longword;
    rbuf:array of byte;
    begin  leng:=Socket.ReceiveLength;
      setlength(rbuf,leng);
      for i:=low(rbuf) to high(rbuf) do
      begin
          rbuf[i]:=0
      end;  Socket.ReceiveBuf(rbuf[0],leng);
      

  2.   


    设备返回的数据包是有个协议的,我觉得您说的这个应该是比较贴近我的现实情况的。一整个包接收,我用recv函数可以吗,哪里不是要确定长度才行吗?能否再详细指导下,我在这块确实太菜了
      

  3.   

    leng:=Socket.ReceiveLength;  这个怎么取?不会
      

  4.   


    我做TCP通讯一般用的是自带的ClientSocket和ServerSocket,ClientSocket里面有个OnRead事件
    procedure TMainForm.ClientSocketRead(Sender: TObject;Socket: TCustomWinSocket);
    数据接收触发。Socket.ReceiveLength是触发后获取到的数据包长度。
    你说的recv我不知道是哪个里面来的。
      

  5.   


    我做TCP通讯一般用的是自带的ClientSocket和ServerSocket,ClientSocket里面有个OnRead事件
    procedure TMainForm.ClientSocketRead(Sender: TObject;Socket: TCustomWinSocket);
    数据接收触发。Socket.ReceiveLength是触发后获取到的数据包长度。
    你说的recv我不知道是哪个里面来的。原来是这样,我没有用控件,直接建立的套子段
      

  6.   

    LZ协议描述不够详细, 不过版主的话可以解决你的问题这个之前也有人说过,可是看了我的协议觉得不现实。以下是我的协议
     应答帧结构:
        +--------+--------+------------------------------------------+
        |  字段  | 字节数 | 描述                                     |
        +--------+--------+------------------------------------------+
        | 帧头   | 1      | 0x02,表明一帧的开始,为接收方提供同步   |
        | 地址   | 2      | 可变信息标志地址,由可变信息标志厂家设定 |
        | 帧数据 | 不定长 |                                          |
        | 帧校验 | 2      | 供接收方判断所收帧的正确性               |
        | 帧尾   | 1      | 0x03,表明一帧的结束,为接收方提供同步   |
        +--------+--------+------------------------------------------+