📄 494.htm
字号:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>CTerm非常精华下载</title>
</head>
<body bgcolor="#FFFFFF">
<table border="0" width="100%" cellspacing="0" cellpadding="0" height="577">
<tr><td width="32%" rowspan="3" height="123"><img src="DDl_back.jpg" width="300" height="129" alt="DDl_back.jpg"></td><td width="30%" background="DDl_back2.jpg" height="35"><p align="center"><a href="http://apue.dhs.org"><font face="黑体"><big><big>apue</big></big></font></a></td></tr>
<tr>
<td width="68%" background="DDl_back2.jpg" height="44"><big><big><font face="黑体"><p align="center"> ● UNIX网络编程 (BM: clown) </font></big></big></td></tr>
<tr>
<td width="68%" height="44" bgcolor="#000000"><font face="黑体"><big><big><p align="center"></big></big><a href="http://cterm.163.net"><img src="banner.gif" width="400" height="60" alt="banner.gif"border="0"></a></font></td>
</tr>
<tr><td width="100%" colspan="2" height="100" align="center" valign="top"><br><p align="center">[<a href="index.htm">回到开始</a>][<a href="473.htm">上一层</a>][<a href="495.htm">下一篇</a>]
<hr><p align="left"><small>---------------------------------------------------------------------------- <br>
---- <br>
cloudsky 于 00-6-19 10:24:25 加贴在 绿盟科技论坛(bbs.nsfocus.com)--UNIX系统 <br>
安全: <br>
几乎所有的tcp/ip协议族的校验和算法都是这个。区别在于各个协议需要校验的 <br>
数据不同,比如tcp/udp需要额外构造伪头标进行校验。希望下面的代码片段能解决 <br>
你的问题。这里唯一需要理解的就是构造完伪头标连带伪头标一并计算校验和。给 <br>
的例子是我以前一个udp应用中的片段,tcp的类似 <br>
void overflowTarget ( ... ) <br>
{ <br>
u_char * pPseudoHead = NULL; /* 指向伪头标的指针 */ <br>
struct pseudoHead * ph = NULL; <br>
char * rawBuffer = NULL; <br>
char * udpDataBuf = NULL; <br>
size_t rawBufferLen = 0; <br>
size_t udpDataLen = 0; <br>
struct ip * ipheader = NULL; <br>
struct udphdr * udpheader = NULL; <br>
/* 计算UDP报文校验和,包括了UDP数据区,伪头标占用12个字节 */ <br>
pPseudoHead = rawBuffer + sizeof( struct ip ) - sizeof( struct p <br>
seudoHead ); <br>
ph = ( struct pseudoHead * )pPseudoHead; <br>
memset( pPseudoHead, 0, sizeof( struct pseudoHead ) + sizeof( struct udp <br>
hdr ) ); <br>
udpheader->uh_sport = sourceAddress.sin_port; <br>
udpheader->uh_dport = targetAddress.sin_port; <br>
udpheader->uh_ulen = htons( ( u_short )( sizeof( struct udphdr ) + udpD <br>
ataLen ) ); <br>
udpheader->uh_sum = 0; <br>
ph->sourceIp = sourceAddress.sin_addr; <br>
ph->targetIp = targetAddress.sin_addr; <br>
ph->zero = 0; <br>
ph->protocol = IPPROTO_UDP; <br>
ph->length = udpheader->uh_ulen; <br>
/* 指定源和目标端口 */ <br>
udpheader->uh_sum = in_cksum( ( u_short * )pPseudoHead, <br>
sizeof( struct pseudoHead ) + sizeof( struct udphdr ) + udpDataLen ) <br>
; <br>
bzero( rawBuffer, sizeof( struct ip ) ); <br>
ipheader->ip_v = 4; <br>
ipheader->ip_hl = sizeof( struct ip ) / 4; /* IP头长度计算所用单位为 <br>
32bit字 */ <br>
/* 数据包长度用字节表示, 包括头的长度 */ <br>
ipheader->ip_len = htons( rawBufferLen ); <br>
ipheader->ip_id = 0; /* 由内核去设置它,其次内核总是亲自计算IP头部校 <br>
验和 */ <br>
/* 生存时间表示数据被丢失前保存在网络上的时间, 以秒计 */ <br>
ipheader->ip_ttl = 255; <br>
ipheader->ip_p = IPPROTO_UDP; <br>
/* 指定源和目标IP地址 */ <br>
ipheader->ip_src = sourceAddress.sin_addr; <br>
ipheader->ip_dst = targetAddress.sin_addr; <br>
return; <br>
} /* end of overflowTarget */ <br>
---------------------------------------------------------------------------- <br>
---- <br>
backend 于 00-6-19 20:50:53 加贴在 绿盟科技论坛(bbs.nsfocus.com)--UNIX系统安 <br>
全: <br>
在《用TCP/IP进行网际互连》(第一卷)的P133-135是关于UDP协议的, <br>
P151-152是关于TCP协议的。虽然里面没有详细的算法说明和代码,但它 <br>
的文字已经足够使你清楚TCP/UDP数据包校验和的计算原理了。 <br>
</small><hr>
<p align="center">[<a href="index.htm">回到开始</a>][<a href="473.htm">上一层</a>][<a href="495.htm">下一篇</a>]
<p align="center"><a href="http://cterm.163.net">欢迎访问Cterm主页</a></p>
</table>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -