加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 黄冈站长网 (http://www.0713zz.com/)- 数据应用、建站、人体识别、智能机器人、语音技术!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

Linux内核分析 - 网络[十二]:UDP模块 - 收发

发布时间:2016-10-16 06:09:35 所属栏目:Linux 来源:站长网
导读:副标题#e# 内核版本:2.6.34 UDP报文接收 UDP报文的接收可以分为两个部分:协议栈收到udp报文,插入相应队列中;用户 调用recvfrom()或recv()系统调用从队列中取出报文,这里的队列就是sk-sk_receive_queue,它是报文中转的纽带,两部 分的联系如下图所示。

这段代码获取要发送数据的目的地址和端口号。一种情况是调用sendto()发送数据,此 时目的的信息以参数传入,存储在msg->msg_name中,因此从中取出daddr和dport;另一种情况是调用connect(), send()发 送数据,在connect()调用时绑定了目的的信息,存储在inet中,并且由于是调用了connect(),sk->sk_state会设置为 TCP_ESTABLISHED。以后调用send()发送数据时,无需要再给入目的信息参数,因此从inet中取出dadr和dport。而connected表 示了该socket是否已绑定目的。

if (msg->msg_name) {     
 struct sockaddr_in * usin = (struct sockaddr_in *)msg->msg_name;     
 if (msg->msg_namelen < sizeof(*usin))     
  return -EINVAL;     
 if (usin->sin_family != AF_INET) {     
  if (usin->sin_family != AF_UNSPEC)     
   return -EAFNOSUPPORT;     
 }     
         
 daddr = usin->sin_addr.s_addr;     
 dport = usin->sin_port;     
 if (dport == 0)     
  return -EINVAL;     
} else {     
 if (sk->sk_state != TCP_ESTABLISHED)     
  return -EDESTADDRREQ;     
 daddr = inet->inet_daddr;     
 dport = inet->inet_dport;     
 connected = 1;     
}

(编辑:PHP编程网 - 黄冈站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读