📄 438.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="317.htm">上一层</a>][<a href="439.htm">下一篇</a>]
<hr><p align="left"><small>:看白云的相关讨论. <br>
发信人: scz (小四), 信区: Socket <br>
标 题: [转载] [转寄] Re: 一个简单的网络侦听程序 (答 cloudsky) <br>
发信站: 华南网木棉站 (Mon Nov 8 17:46:45 1999), 转信 <br>
【 以下文字转载自 scz 的信箱 】 <br>
【 原文由 cloudsky.bbs@bbs.whnet.edu.cn 所发表 】 <br>
发信人: rain (八角虫), 信区: Programming <br>
标 题: Re: 一个简单的网络侦听程序 (答 cloudsky) <br>
发信站: 武汉白云黄鹤站 (Tue Aug 31 09:12:05 1999), 转信 <br>
: struct etherpacket <br>
: { <br>
: struct ethhdr eth; <br>
: struct iphdr ip; <br>
: struct tcphdr tcp; <br>
: char data[8192]; <br>
: }; <br>
: int main() <br>
: { <br>
: struct etherpacket ep; <br>
: struct iphdr *ip; <br>
: struct tcphdr *tcp; <br>
: ip=(struct iphdr *)(((unsigned long)&ep.ip)-2); <br>
^^ <br>
: tcp=(struct tcphdr *)(((unsigned long)&ep.tcp)-2); <br>
^^ <br>
这里为什么不是直接用 ep.ip 和 ep.tcp,而是要先减2在转成 struct iphdr, struc <br>
t tc <br>
hdr <br>
原因是这样的:首先是本人学艺不精 :( <br>
其次是 gcc 编译时默认机器字对准,struct ethhdr 是14字节长,在 32 位机上, <br>
下一个变量就会从 16 字节开始,因此 struct iphdr 和 struct ethhdr 之间就 <br>
空出了两个字节,所以要减 2,iphdr 刚好 20 个字节,所以 tcphdr 和 iphdr 中 <br>
没有空隙,依旧是减 2。 <br>
后来我在仔细阅读过 gcc info 之后发现这样写就不用减 2 了 <br>
struct etherpacket <br>
{ <br>
struct ethhdr eth; <br>
struct iphdr ip; <br>
struct tcphdr tcp; <br>
char data[8192]; <br>
} __attribute__ ((packed)); <br>
该文本在 gcc2.72 的 gcc.info-9 中. <br>
cloudsky 看程序真是仔细,我贴了这么久从来没人问过这个问题, <br>
当然也许大家都懂,就咱哥俩笨,到现在才明白 :( <br>
-- <br>
哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈 <br>
哈 哈 <br>
哈 佛颜常笑,笑世上可笑之人 哈 <br>
忍 大肚能容,容天下难容之事 忍 <br>
忍 忍 <br>
忍忍忍忍忍忍忍忍忍忍忍忍忍忍忍 <br>
※ 来源:.武汉白云黄鹤站 bbs.whnet.edu.cn.[FROM: 202.114.113.240] <br>
-- <br>
※ 转寄:.武汉白云黄鹤站 bbs.whnet.edu.cn.[FROM: 203.207.226.124] <br>
-- <br>
</small><hr>
<p align="center">[<a href="index.htm">回到开始</a>][<a href="317.htm">上一层</a>][<a href="439.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 + -