现在我们换一个角度,站在服务器的一方,看看如何被动地接收一个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。
阅读(419) | 评论(0) | 转发(0) |