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