Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1355365
  • 博文数量: 1334
  • 博客积分: 645
  • 博客等级: 上士
  • 技术积分: 5762
  • 用 户 组: 普通用户
  • 注册时间: 2012-07-25 16:56
文章分类

全部博文(1334)

文章存档

2014年(108)

2013年(1059)

2012年(169)

分类: LINUX

2013-01-18 19:31:07

原文地址:接收一个UDP数据报 作者:futter521

现在我们换一个角度,站在服务器的一方,看看如何被动地接收一个UDP数据,并作出相应的处理。我们把前面文章提及的UDP示例客户端放到 172.16.48.1上,在主机172.16.48.2的eth0网络设备接口上再配一个从属IP地址172.16.48.13。让客户端向13发送 UDP数据报。
    函数myudp_rcv处理接收到的UDP数据报,该函数首先从数据报头中取出源和目的地址、端口。向哈希表myudp_hash查询,看是否存在相应的 sokcet等待处理该数据报。如果没有,则发生错误,即对端主机向本机的某个特定端口发送了一个UDP数据,但本机并没有该端口标识的进程需要处理该数 据报,所以,这是一个目的端口不可达错误。调用myicmp_send发送一个目的端口不可达出错报文。
    目的端口不可达ICMP报文需要将整个源出错UDP报文作为数据负载(payload)放进报文中,所以,首先要对源UDP报文进行基本的正确性检查。还 需要生成一份详细的ICMP参数信息,用于生成ICMP报文,ICMP参数信息用结构体struct icmp_bxm表示,下面是该结构体的定义:
    struct icmp_bxm {
        struct sk_buff *skb;    //指向所在的sk_buff
        int offset;             //出错的源UDP报文在ICMP报文中的偏移量。
        int data_len;

        struct {
            struct icmphdr icmph;   //icmp头,需要填充完整。
            __u32          times[3];
        } data;
        int head_len;
        struct ip_options replyopts;    //ip选项。
        unsigned char  optbuf[40];
    };
    发送一个数据报,相应的,肯定需要一个套接字,为发送这个ICMP服文,协议栈为每个CPU创建了一个套接字,命名为myicmp_socket。
阅读(396) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~