请问winsock API数据传送中,什么是数据包?它是一个文件还是什么?
Type    TORG_VSPP_Head = packed record
        Headsign      : Array [0..1] of char ;
        length        : Array [0..4] of char ;
        category      : Array [0..1] of char ;
        sub_command   : Array [0..1] of char ;
        opcode        : Array [0..3] of char ;
        seq_no        : Array [0..9] of char ;
        sp_id         : Array [0..3] of char ;
        service_id    : Array [0..4] of char ;
        operate_id    : Array [0..4] of char ;
        callingnumber : Array [0..19]of char ;
        callednumber  : Array [0..19]of char ;
        errno         : Array [0..4] of char ;
        cry_type      : Array [0..4] of char ;
        key_no        : Array [0..4] of char ;
    end;
    TPRC_VSPP_Head  = packed record
        Headsign      : Array [0..2]  of char ;
        length        : Array [0..5]  of char ;
        category      : Array [0..2]  of char ;
        sub_command   : Array [0..2]  of char ;
        opcode        : Array [0..4]  of char ;
        seq_no        : Array [0..10] of char ;
        sp_id         : Array [0..4]  of char ;
        service_id    : Array [0..5]  of char ;
        operate_id    : Array [0..5]  of char ;
        callingnumber : Array [0..20] of char ;
        callednumber  : Array [0..20] of char ;
        errno         : Array [0..5]  of char ;
        cry_type      : Array [0..5]  of char ;
        key_no        : Array [0..5]  of char ;
    end;
var
    orgvspp_head : TORG_VSPP_Head ;
    prcvspp_head : Tprc_vspp_head ;
    buffer    : array [0..65536] of char ;
    ret:integer;
function VSPP_Head_org2prc(var Dest:Tprc_VSPP_Head;org:TORG_VSPP_Head) :integer;
Begin
    strlcopy(dest.headsign,     org.headsign,2 ) ;
    strlcopy(dest.length,       org.length,5 ) ;
    strlcopy(dest.category,     org.category,2 ) ;
    strlcopy(dest.sub_command,  org.sub_command,2 ) ;
    strlcopy(dest.opcode,       org.opcode,4 ) ;
    strlcopy(dest.seq_no,       org.seq_no,10 ) ;
    strlcopy(dest.sp_id,        org.sp_id,4 ) ;
    strlcopy(dest.service_id,   org.service_id,5 ) ;
    strlcopy(dest.operate_id,   org.operate_id,5 ) ;
    strlcopy(dest.callingnumber,org.callingnumber,20 ) ;
    strlcopy(dest.callednumber, org.callednumber,20 ) ;
    strlcopy(dest.errno,        org.errno,5 ) ;
    strlcopy(dest.cry_type,     org.cry_type,5 ) ;
    strlcopy(dest.key_no,       org.key_no,5 ) ;
End;
---------------------------------------------------------------
        ret:= recv(FSocket, buffer, 94 , 0); ????????这里收到的是什么,
        CopyMemory(@orgvspp_head,@buffer,sizeof(orgvspp_head));
        VSPP_Head_org2prc(prcvspp_head,orgvspp_head);???为什么可以这样赋值请大家指示指示好吗

解决方案 »

  1.   

    数据报在实际应用中就是自己定义的 数据结构而已ret:= recv(FSocket, buffer, 94 , 0); ????????这里收到的是什么,
    // 你发过来的是什么就是什么 不过只读取前面的94BYTE。
            CopyMemory(@orgvspp_head,@buffer,sizeof(orgvspp_head));
    // 然后就把 你的buffer中内容拷贝给org... 其实也可以直接用强行类型转换的,但是可能你的buffer内容会经常变动,所以用copy比较安全
            VSPP_Head_org2prc(prcvspp_head,orgvspp_head);???为什么可以这样赋值
    ??  你看看VSPP_Head_org2prc 的定义就知道了 var Dest类似c++的引用 就是表示在本函数中可以修改Dest中的值,因为你赋值的不是简单的数据,而是自定义数据结构,所以需要单独的copy,也就是 bitwise copy 深层次拷贝<如果有用到指针就是需要这么拷贝的>
     
    function VSPP_Head_org2prc(var Dest:Tprc_VSPP_Head;org:TORG_VSPP_Head) :integer;
      

  2.   

    “包”(Packet)是TCP/IP协议通信传输中的数据单位,一般也称“数据包”。有人说,局域网中传输的不是“帧”(Frame)吗?没错,但是TCP/IP协议是工作在OSI模型第三层(网络层)、第四层(传输层)上的,而帧是工作在第二层(数据链路层)。上一层的内容由下一层的内容来传输,所以在局域网中,“包”是包含在“帧”里的。
    我们可以用一个形象一些的例子对数据包的概念加以说明:我们在邮局邮寄产品时,虽然产品本身带有自己的包装盒,但是在邮寄的时候只用产品原包装盒来包装显然是不行的。必须把内装产品的包装盒放到一个邮局指定的专用纸箱里,这样才能够邮寄。这里,产品包装盒相当于数据包,里面放着的产品相当于可用的数据,而专用纸箱就相当于帧,且一个帧中只有一个数据包。
    “包”听起来非常抽象,那么是不是不可见的呢?通过一定技术手段,是可以感知到数据包的存在的。比如在Windows 2000 Server中,把鼠标移动到任务栏右下角的网卡图标上(网卡需要接好双绞线、连入网络),就可以看到“发送:××包,收到:××包”的提示。通过数据包捕获软件,也可以将数据包捕获并加以分析。
    数据包的结构非常复杂,不是三言两语能够说清的,在这里我们主要了解一下它的关键构成就可以了,这对于理解TCP/IP协议的通信原理是非常重要的。数据包主要由“目的IP地址”、“源IP地址”、“净载数据”等部分构成。
    数据包的结构与我们平常写信非常类似,目的IP地址是说明这个数据包是要发给谁的,相当于收信人地址;源IP地址是说明这个数据包是发自哪里的,相当于发信人地址;而净载数据相当于信件的内容。
    正是因为数据包具有这样的结构,安装了TCP/IP协议的计算机之间才能相互通信。我们在使用基于TCP/IP协议的网络时,网络中其实传递的就是数据包。