你的位置:pcMing工作室 >> 资讯 >> 网络技术 >> 详细内容 在线投稿

TCP/IP头格式

排行榜 收藏 打印 发给朋友 举报 来源: 互联网   发布者:未知
热度973票  浏览137次 【共0条评论】【我要评论 时间:2010年1月23日 22:06
一、先是常用的IP头格式。
;D:`a,e$t)r+Y6l4E0  IP头格式:
X YQjRJ,B5d P0F@0  版本号 (4位)
0dsN`#IJ_1yH0  IP头长度 (4位)
8`&yt+Sk SI0  服务类型 (8位)pcMing工作室gT{;dQ
  数据包长度 (16位)
#w"`7GuZ5u0  标识段 (16位)pcMing工作室)|a r0{[Y:vj
  标志段 (16位)
6W!hJQ,[j.o*_0  生存时间 (8位)pcMing工作室"~ c2`/u%Z.j
  传输协议 (8位)pcMing工作室2PEJsmN3JuoRl
  头校验和 (16位)pcMing工作室BN:Tr1a4eB
  发送地址 (16位)
Ei;c4Vn:N _s0  目标地址 (16位)pcMing工作室y%~`_ s-^mPq
  选项pcMing工作室%F+}R3m Q
  填充
Km Up/H#j0  简单说明
/u"`Cb#jt Sst4WW0  ============
(T9K e%[,A0  1. IP头长度计算所用单位为32位字, 常用来计算数据开始偏移量pcMing工作室gzj_*h4s
  2. 数据包长度用字节表示, 包括头的长度, 因此最大长度为65535字节pcMing工作室 J;_#Q$Vy8vT0Q/x
  3. 生存时间表示数据被丢失前保存在网络上的时间, 以秒计.
aF6P \3i:UF n_R0  4. 头校验和的算法为取所有16位字的16位和的补码.pcMing工作室r3A,l }}
  5. 选项长度是可变的, 填充区域随选项长度变化, 用于确保长度为整字节的倍数.
CM s5Q0x*k3G0  描述pcMing工作室R P4B#_j M,f^
  ============
c S5{ Mi'p:M6`)O;A0  struct iphdr {
d)p_#n6U [hjQ-\j*\0  BYTE versionihl;pcMing工作室"{zhEa eX~4_
  BYTE tos;pcMing工作室WC!^Vj$e9DW!b P
  WORD tot_len;pcMing工作室)h S5am3GZ/K
  WORD id;pcMing工作室A RRYqM?:ZV0[
  WORD frag_off;pcMing工作室a{_7b.MK{
  BYTE ttl;
s\i&Mb fM\0  BYTE protocol;
UySM7F!^:b0  WORD check;
Kz2vYv&LJ:i0  DWORD saddr;pcMing工作室2?Hm.I(T
  DWORD daddr;pcMing工作室SLmCs^
  /* Put options here. */pcMing工作室&c"|e3~]k]'}P
  };
7O-mZ3c._ q0  二、TCP头格式
J:Wp1L~R.NRaiph0  TCP头格式:
c9rWWAikF$V0  源端口 (16位)
z)G)Y/e6y_,sJ+y!t0  目的端口 (16位)pcMing工作室 d(I~/I2}'Z
  序号 (32位)pcMing工作室iO&x0O!cTe$D
  确认号 (32位)pcMing工作室#M pDp%P f(Pl
  数据偏移 (4位)pcMing工作室%@2M3s [#{8q \[@
  保留 (6位)
:S6V&CTL Myr,L0  标志 (6位)
*U+F'?W X7x0  窗口 (16位)pcMing工作室?B uod(W
  校验和 (16位)
SS-Jkz8E.P0  紧急指针 (16位)pcMing工作室+A&hqu$Z@8O5}E
  选项pcMing工作室L5p"GY,IaR
  填充pcMing工作室g,K[7A[1sc
  简单说明pcMing工作室\$S8mX$gF2p2q
  ============pcMing工作室p:@lg7dN g6j
  1. 数据偏移用于标识数据段的开始pcMing工作室2Dq q$H-B T.K7JbkMZ
  2. 保留段6位必须为0
Qdr!l_%t!F0  3. 标志包括紧急标志、确认标志、入栈标志、重置标志、同步标志等。pcMing工作室"W wh f"W+n
  4. 校验和计算方式为将头与16位二进制反码和中的16位二进制反码加在一起。pcMing工作室1O ^ Aii'E2^I
  5. 选项长度是可变的, 填充区域随选项长度变化, 用于确保长度为整字节的倍数.
M6Z!n gCmSue0  6. 更详细的说明请参阅有关资料。pcMing工作室8A5O r+int)q[\
  描述
"[a` Lc Z:Y0  ============
?k4fv A0  struct tcphdr {
F[(K1J?V0  WORD SourPort;
*XYD/n dB;@9M0  WORD DestPort;
7z oe+\"QTfi5eg0  DWORD SeqNo;pcMing工作室jy$J7H uq8h^P3H
  DWORD AckNo;
3|#POI2w[/F0  BYTE HLen;pcMing工作室H0]+k"wDS8T
  BYTE Flag;
}$^E)r }0  WORD Window;pcMing工作室vX$L ]MZ!H
  WORD ChkSum;pcMing工作室K b Ca N
  WORD UrgPtr;
U `n ]l7?k5}J{0  /* Put options here. */
Bxt(r,s)b0  };
Q,CqG k0U0   pcMing工作室t4xL&^@
   pcMing工作室i e[,V%O
  UDP
%K8pv'Z*Y'j0   pcMing工作室Ok eIx
  一、说明pcMing工作室+OZ5Ecm#U]V(x
  使用UDP时,直接使用API代替控件。
5D'r+e rO']0  第一个程序(ReadBufferUdp)使用来接收到缓存中。
"j%W(s/JH0  "Destino"变量非常重要,如果你从其他地方接收数据到Buffer,你必须设置Destino = 0pcMing工作室Ii7_-l"vs+xx
  并且在以后执行的时候赋值你将要发送的包的地址给它(after the execution it will have the address
;H9lrCE0  which send you the packet.)。pcMing工作室N(^ os ?n d5@F%L
  如果你只想从一个指定的地址接收数据,你必须设置变量Destino = <address>.
5@ W O9v$}(}t4`0  "gvEncerrar" 用来中止处理过程。(gvEncerrar被设置为全局变量。)
*z bU[m:hG+i0  超时时间设置。"Inicio + 12" = 12 sec of timeout.
(o&^p"p1T*q0  第三个程序是用来准备WinSock程序。
w]#t |*E0  二、代码
*}C?t+~q!@;{0  int ReadBufferUdp(unsigned long *Destino,void *T,int Size)
k-^LY LD;a O0  {
7s4C*aY,jT0  char Buffer[128];pcMing工作室&Y,fWjr2k
  SOCKADDR_IN SockAddr;pcMing工作室wH2t.@)UWNf;a
  int LenSockAddr=sizeof(SOCKADDR_IN);pcMing工作室+}@%j1Y(M
  fd_set FdRead;pcMing工作室RlQ R@ u
  struct timeval t_val;pcMing工作室(D(^"z3|:w$d8{&W:G5lt
  int Ret;
;pO)M x6H1d`V0  time_t Inicio = time(NULL);
7F!H'S? ?Q|_X0  Application->ProcessMessages();
I)~d6smF0  if(gvEncerrar)pcMing工作室7qq%_5s9zc7jLdA
  return false;pcMing工作室I V5dI rR$J
  FD_ZERO(&FdRead);
\XK%X"\X0  FD_SET(gvSocket,&FdRead);pcMing工作室/`c4up3R)s
  t_val.tv_sec=0;
3['] R-ZFOcu [:w0  t_val.tv_usec=0;
W K} U+ZQE;}IR0  while((Ret=select(0,&FdRead,NULL,NULL,&t_val))!=1 && (Inicio + 12) >pcMing工作室9VlMqu,V+zHO8?
  time(NULL) && !gvEncerrar)pcMing工作室5J(wT.{}
  {
+D(n0` yPe0  FD_ZERO(&FdRead);
&`Q&s-`|}0  FD_SET(gvSocket,&FdRead);
SA6N,^5W\xw0  t_val.tv_sec=0;pcMing工作室5c1y8\,V]/\7R
  t_val.tv_usec=0;
Dt%g G1wZX8`8t0  Application->ProcessMessages();pcMing工作室WN'x2C W
  }pcMing工作室,r0|OB|/HR}
  if(Ret != 1)pcMing工作室4l n1`'K Py.K&N
  return false;
1Sq;l^ L/};V'R [0  if(recvfrom(gvSocket,Buffer,Size,0,(LPSOCKADDR)&SockAddr,&LenSockAddr)!=Size)pcMing工作室a'nE.OT] i.x4[ ]
  return false;
7eb4h}}0  if(*Destino == 0)
)\{5Rd zi;N0  {
)o$Zi5biw"]3Z0  *Destino = SockAddr.sin_addr.s_addr;
oF"{1PJXVm"[3W0  }pcMing工作室:vK4dyG8u8o
  elsepcMing工作室v \3L l,Hr1L
  if(*Destino != SockAddr.sin_addr.s_addr)
uRM`5H0sQ S7G0  return false;pcMing工作室!v5V+~N Q ])u-c
  memcpy(T,Buffer,Size);pcMing工作室hG#c:elY2b/g
  return true;
O J [/B} PEI)}0  }
~&j-n o0R"y(m0  int WriteBufferUdp(unsigned long Destino,void *T,int Size)pcMing工作室[zS&F&kd
  {pcMing工作室m#n V6gdAxX0A1g
  SOCKADDR_IN SockAddr;pcMing工作室 y&hH'@.B]
  int Sent;
"w2@C/i)Bf0  Application->ProcessMessages();pcMing工作室mPQ4a[
  SockAddr.sin_family = AF_INET;
Ls8s G B0  SockAddr.sin_port = gvPortUdp;pcMing工作室DbK li*\O$J
  SockAddr.sin_addr.s_addr = Destino;pcMing工作室 ^J-ot,P%ZQ1hY
  Sent = sendto(gvSocket,(charpcMing工作室%~%i ^.snvF
  *)T,Size,0,(LPSOCKADDR)&SockAddr,sizeof(SockAddr));pcMing工作室 N-Sp H5d0r+g&|Ba)A'g
  if(Sent != Size)
izAs1||%j-].a0l0  return false;
V _6a9OmN+_3[0  else
OY:A kxM5m0  return true;pcMing工作室7\5w8y*b!Q.q{0v/i6g
  }pcMing工作室o7gr\vqDA
  void InicializaTCPIP()pcMing工作室J H!v m A.W#Q*b/Z:[
  {pcMing工作室 kP Jwe:@
  WORD wVersionRequested;
1?X/WS.i.|s0  WSADATA wsaData;pcMing工作室Bp7f:j;{*_XG
  IN_ADDR In;pcMing工作室L9I1e y&B*NEB)IQ
  PSERVENT PServent;pcMing工作室5HWf,z"TLk uo
  SOCKADDR_IN SockAddrIn;
7BX pc@|0  wVersionRequested = MAKEWORD( 1, 1 );pcMing工作室.rU0@Y l}Y:wM
  if(WSAStartup( wVersionRequested, &wsaData ))
OxJ2Dw6g7hK0  {pcMing工作室h/Z2s5j S3E
  ShowMessage("Erro na inicializao do TCP/IP");pcMing工作室xi/FX i{A
  Application->Terminate();pcMing工作室+_Mp|UG
  return;
"] yt;U Z rOX/i4Sh0  }pcMing工作室n1P9y }aytj}+NQ
  // Get the port on service file
*F%A'l+\ ]EV?4sV0  if((PServent=getservbyname("your_service_name","udp"))==NULL)
2u"P hB;w,_1v'?0  {
ju gW;b,n0  ShowMessage("Erro obtendo port do servi transurb/udp");
j o0}7T0Uc&V'a9w0  Application->Terminate();
R;Y)U%Q~u{TN6ov0  return;
8QOaR q"T.tX0  }
feR,I"`G0  gvPortUdp = PServent->s_port;pcMing工作室s(ic tZBx
  sprintf(StrAux,"Servi transurb/udp port:%d",ntohs(gvPortUdp));
*CKSBO%AO4C9o0  Log(StrAux);pcMing工作室)Pyg AWU:Vx
  // Open de Socket
't+^ G4_K1KR!@1V!m0  if((gvSocket = socket(AF_INET,SOCK_DGRAM,0))==INVALID_SOCKET)pcMing工作室"Q [x M8g3V)s
  {
(b?WmH2KPM0  ShowMessage("Erro na criao do socket");pcMing工作室Cwqj3nO?
  Application->Terminate();pcMing工作室1ga[k(U!aq)a
  return;pcMing工作室*L7NZ&Ig
  }
1UWt8LP0  Log("Socket criado com sucesso");pcMing工作室 qJ4\?d I4z*]
  // Do the bind
kPHe&Tt~u0  SockAddrIn.sin_family = AF_INET;pcMing工作室X!d7_`j HhDf
  SockAddrIn.sin_port = gvPortUdp;
,^ Zy9w e$y\ U7n0  SockAddrIn.sin_addr.s_addr = NULL;
%E*c2i/k dgD0  if(bind(gvSocket,(LPSOCKADDR)&SockAddrIn,sizeof(SockAddrIn))==SOCKET_ERROR)pcMing工作室|bqq.Ui&x$v
  {
Uy+q8V"Y'T6F0I0  ShowMessage("Erro no bind do socket");
:W~4ny-S^!A @0  Application->Terminate();pcMing工作室,u jf(@sg
  return;pcMing工作室qrbb0U%e!QV
  }
&piAcuVmN PfI0  Log("Bind do socket com sucesso");
0bIR]%HU.K0  }
$WW:K1]7O"M9s$xn0   
qY[!G,o v-t7g0  判断windows的Desktop及其它目录
Qh@IX0W0   
y#^m"~b ElW0  使用API函数SHGetSpecialFolder。shlobj.h里有SHGetSpecialFolder的原型声明。这个函数可以帮我们找到windows的Desktop目录、启动目录、我的文档目录等。
T2_S8\^-o(L0  SHGetSpecialFolder需要三个参数。
5Fl oI)s0  第一个参数是HWND,它指定了"所有者窗口":在调用这个函数时可能出现的对话框或消息框。第二个参数是一个整数id,决定哪个目录是待查找目录,它的取值可能是:
(kAy p;k0X5JW [9xe _0  CSIDL_BITBUCKET 回收站pcMing工作室 ['X{2S v8mp
  CSIDL_CONTROLS 控制面板
5b#U]:a*rlZEg0  CSIDL_DESKTOP Windows 桌面desktop
:l Y!T[4`y,y?0x3z0  CSIDL_DESKTOPDIRECTORY desktop的目录pcMing工作室3K{#x#k [CDrh
  CSIDL_DRIVES 我的电脑pcMing工作室/_,Uq RR7?\6Q!F
  CSIDL_FONTS 字体目录pcMing工作室[!F(i7QvH\cl
  CSIDL_NETHOOD 网上邻居
6|ESD}-~$t0  CSIDL_NETWORK 网上邻居virtual folderpcMing工作室q6Z8WSp1?Xs
  CSIDL_PERSONAL 我的文档
LX|!cxA*n0  CSIDL_PRINTERS 打印机pcMing工作室z)N}0R7|XaW!n
  CSIDL_PROGRAMS 程序组
3Q1IkB-qah z _0  CSIDL_RECENT 大多数最近打开的文档列一pcMing工作室z4ffg x5["\Ql
  CSIDL_SENDTO “发送到”菜单项pcMing工作室 N0P:w#c;}uJ OJ1\
  CSIDL_STARTMENU 任务条启动菜单项
wb'_-gW0  CSIDL_STARTUP 启动目录
"TW8H!Ze(e/f6z0  CSIDL_TEMPLATES 临时文档
"}4KI TNR[a-y0  最后一个参数是pidl地址。SHGetSpecialFolderLocation把地址写到pidl。pcMing工作室 q aXUt+Td'o b0l
  下面的代码演示了怎样使用SHGetSpecialFolderLocation:pcMing工作室5k_v:lE!h+T
  //----------------------------------------------------------------------
'u&Zx.Yf$F-Jm0  void __fastcall TForm1::Button1Click(TObject *Sender)pcMing工作室^c`8N~!K8q,sW
  {
tFqrvI)y3r0  LPITEMIDLIST pidl;
7Vy8H e9E3Ln&o0  LPMALLOC pShellMalloc;pcMing工作室1N5Kn)l n1X @
  char szDir[MAX_PATH];pcMing工作室"A Q2F%jm [
  if(SUCCEEDED(SHGetMalloc(&pShellMalloc)))
qUl { Ft%zG0  {
?K)B v4i9bI0  if(SUCCEEDED(SHGetSpecialFolderLocation(NULL,
U MS-Su0  CSIDL_DESKTOPDIRECTORY,pcMing工作室 Bw{7Q/d c&h
  &pidl)))pcMing工作室uV4_Q Ju,q i/t
  {
[%iUL/L$n0  // 如果成功返回true
]1k[M]*Xee.s0  if(SHGetPathFromIDList(pidl, szDir))pcMing工作室job#p$gtW
  {pcMing工作室6iwIxV]
  Label1->Caption = szDir;pcMing工作室(OGp b-X8s$Ks
  }pcMing工作室Z*Q^+Kyj
  pShellMalloc->Free(pidl);pcMing工作室 C#w4r k.bq
  }pcMing工作室 ~y F j LxJO
  pShellMalloc->Release();pcMing工作室3D f y1a$mj*^.f
  }
4vMC"R5dA7Y0  }pcMing工作室D DeI j'v
  //----------------------------------------------------------------------
}[ mQ:hfyeB.PB0  注意: 有些目录是空的。有些特定的目录在这个文件系统上并没有一个相应的目录。pcMing工作室Q r8xC{
   pcMing工作室 [RESH
  取得本地internet机器的名字及IP地址pcMing工作室T8FU q(K
  一、下面的例子使用 Winsock API 取得本地主机的名字及地址
g7E6J8m [0  void __fastcall TForm1::Button1Click(TObject *Sender)
(k4]vo a kWtR0  {pcMing工作室Zjrou
  hostent *p;
._)V}?$J T1I M+f0  char s[128];
:}5zRnPD`0  char *p2;pcMing工作室f'dO}|?j
  //Get the computer namepcMing工作室f0t}u e r$Rk7`
  gethostname(s, 128);pcMing工作室/b fA:J"D_'m I
  p = gethostbyname(s);
2\$e&[3qZg!m9iZ+t0  Memo1->Lines->Add(p->h_name);pcMing工作室6rPBi*bioVB*{
  //Get the IpAddress
B)E2L8^pz-J0  p2 = inet_ntoa(*((in_addr *)p->h_addr));pcMing工作室-~a5R5z F;m ^|
  Memo1->Lines->Add(p2);pcMing工作室Z9HXq3s
  }pcMing工作室)|nrY8]D+m
  void __fastcall TForm1::FormCreate(TObject *Sender)
'K4M EPU0  {
lAJr+ma"m3h*Z0  WORD wVersionRequested;
aZq U4p5J0  WSADATA wsaData;
;bKiWm)q9@1N0  //Start up WinSock
Q&f(QW7F|!P2@Ks0  wVersionRequested = MAKEWORD(1, 1);
cw1R hwq:m{,P0  WSAStartup(wVersionRequested, &wsaData);pcMing工作室Yn{&K;xR'BV#w9WqI
  }
L i5VuV0  void __fastcall TForm1::FormDestroy(TObject *Sender)
$J5fB o0u]-X&B0  {
qgE!y!Z0  WSACleanup();pcMing工作室#kq M\!JF](wj
  }
TAG: TCP
顶:46 踩:59
对本文中的事件或人物打分:
当前平均分:-0.02 (275次打分)
对本篇资讯内容的质量打分:
当前平均分:-0.13 (317次打分)
【已经有276人表态】
49票
感动
29票
路过
25票
高兴
33票
难过
29票
搞笑
42票
愤怒
39票
无聊
30票
同情
上一篇 下一篇
发表评论
换一张

网友评论仅供网友表达个人看法,并不表明本网同意其观点或证实其描述。

查看全部回复【已有0位网友发表了看法】

网络资源