Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1365082
  • 博文数量: 284
  • 博客积分: 3251
  • 博客等级: 中校
  • 技术积分: 3046
  • 用 户 组: 普通用户
  • 注册时间: 2012-04-26 17:23
文章分类

全部博文(284)

文章存档

2019年(2)

2018年(5)

2015年(19)

2014年(13)

2013年(10)

2012年(235)

发布时间:2012-12-21 16:29:29

    接着前一篇,我们来看这个应用程序背后,内核真正做了一些什么事情。    代表MY_INET域套接字的结构体struct inet_sock有一个成员recverr,它占1bit长度,可能的取值是1或0,当为0时表示socket上出错时,只通过系统调用向应用程序返回 错误号,不提供进一步的详细信息。当取值为1时,则表示socket上出错时,则向struct inet_sock的成员sk_error_queue(一个sk_buff的队列)存入一个特殊的struct sk_buff,在sk_buff的成员cb中放入详细......【阅读全文】

阅读(550) | 评论(0) | 转发(1)

发布时间:2012-12-21 16:28:28

 在前一篇中,我们提到在对端主机上没有创建指定的UDP套接字时,我们向其发送一个UDP包,会得到一个目的端口不可达的ICMP出错报文。但内核在处 理完该报文后,给应用程序仅仅返回一个ECONNREFUSED错误号,所以应用程序能知道的全部信息就是连接被拒绝,至于为什么被拒绝,没有办法知道。 我们可以通过套接字选项的设置,让内核返回更为详细的出错信息,以利于调试程序,发现问题。下面是通过套接字选项传递扩展出错信息的一个示例程序。关于内 核原理的分析,在下一篇给出。#include <sys/socket.h>#include <linux/types.h>......【阅读全文】

阅读(505) | 评论(0) | 转发(1)

发布时间:2012-12-21 16:27:40

  标题看起来有点别扭,但的确如此,在我们前面的例子中,我们并没有在对端主机172.16.48.1的16000端口上创建一个UDP套接字(简单地讲就 是没有开启UDP服务器),所以,我们不能期望向这个目的地址发送一个UDP数据报后会收到一个相应的UDP回应。但是,这并不表示我们发出去的数据报石 沉大海,对端主机的TCP/IP协议栈在检查了16000的端口并没有相应的进程需要接收UDP数据后,会回应一个ICMP包,告诉发送端,目的地址不可 达,具体原因是目的端口不可达。下面是在网络中截获的这个ICMP包:    16进制表示的数据包内容 ......【阅读全文】

阅读(5987) | 评论(0) | 转发(1)

发布时间:2012-12-21 16:26:10

  UDP是一个简单的面向数据报的传输层协议,我们先站在UDP客户端的角度来看看如何发送一个UDP数据报,以及协议栈为发送一个UDP数据报做了哪些事情。    UDP数据报可以在未连接的socket上发送(使用sendto系统调用,指定目的地址),也可以在已连接的socket上发送(使用send系统调用,不用指定目的地址),下面我们分两种情况讨论。    下面是一个在未连接的socket上发送UDP数据的用户态程序示例(注:该程序的格式和风格相当不好,只是为临时测试使用。),该程序目前还只管发送,不处理接收,关于接收,我们后......【阅读全文】

阅读(1535) | 评论(0) | 转发(1)

发布时间:2012-12-21 16:25:07

    结构体struct sk_buff中共有三个联合体,分别是h, nh和mac,它们都是一些指针,指向协议栈各层协议的首部。从含有的首部类型来看,nh是h的子集,而mac是nh的子集。《Linux设备驱动程序》 第三版第522页这样介绍这三个联合体:h中包含有传输层的报文头,nh中包含有网络层的报文头,而mac中包含的是链路层的报文头。    光靠这样的一个解释可能过于抽象,让我们来看一个UDP数据报是怎么样穿过数千公里长的网线来到我们的网卡,通过网卡的驱动程序层层向上来到协议栈的上层的。   ......【阅读全文】

阅读(818) | 评论(0) | 转发(1)
给主人留下些什么吧!~~
留言热议
请登录后留言。

登录 注册