免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: 瀚海书香

CU线上连载讨论一从内核源码的角度来剖析Linux网络部分 [复制链接]

论坛徽章:
0
发表于 2011-08-17 20:31 |显示全部楼层
好贴,呵呵,借问:
480 int udp_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
481 size_t len)
482 {
483 struct inet_opt *inet = inet_sk(sk);
484 struct udp_opt *up = udp_sk(sk);
485 int ulen = len
486 struct ipcm_cookie ipc;
487 struct rtable *rt = NULL;
488 int free = 0;
489 int connected = 0;
490 u32 daddr, faddr, saddr;
491 u16 dport
……
525 /*
526 * Get and verify the address.  
527 */
//检查struct msghdr结构的msg_name字段,确定目的地址是否合法
528 if (msg->msg_name) {
529 struct sockaddr_in * usin = (struct sockaddr_in*)msg->msg_name;
530 if (msg->msg_namelen < sizeof(*usin))
531 return -EINVAL;
532 if (usin->sin_family != AF_INET) {
533 if (usin->sin_family != AF_UNSPEC)
534 return -EINVAL;
535 }
//将套接字地址结构中的地址以及端口值赋给本函数中的地址端口值。
537 daddr = usin->sin_addr.s_addr;
538 dport = usin->sin_port;
539 if (dport == 0)
540 return -EINVAL;
541 }  
//即使目的地址为空,但如果套接字处于TCP_ESTABLISHED状态,仍然认为目的地址合法,允许继续传输数据
  else {
542 if (sk->sk_state != TCP_ESTABLISHED)
543 return -EDESTADDRREQ;
544 daddr = inet->daddr;
545 dport = inet->dport;
……


544 daddr = inet->daddr;
545 dport = inet->dport;
这两句是把inet结构体中的地址,端口值赋给本函数中的地址,端口值。
我想问一下
inet->daddr
inet->dport
inet结构体中这个地址,端口的值是哪里来的啊,谁付给它的呢?


源代码网址: http://lxr.oss.org.cn/source/net/ipv4/udp.c#L480

inet结构体为:
110 struct inet_opt {
111 /* Socket demultiplex comparisons on incoming packets. */
112 __u32 daddr; /* Foreign IPv4 addr */
113 __u32 rcv_saddr; /* Bound local IPv4 addr */
114 __u16 dport; /* Destination port */
115 __u16 num; /* Local port */
116 __u32 saddr; /* Sending source */
117 int uc_ttl; /* Unicast TTL */
118 int tos; /* TOS */
119 unsigned cmsg_flags;
120 struct ip_options *opt;
121 __u16 sport; /* Source port */
122 unsigned char hdrincl; /* Include headers ? */
123 __u8 mc_ttl; /* Multicasting TTL */
124 __u8 mc_loop; /* Loopback */
125 __u8 pmtudisc;
126 __u16 id; /* ID counter for DF pkts */
127 unsigned recverr : 1,
128 freebind : 1;
129 int mc_index; /* Multicast device index */
130 __u32 mc_addr;
131 struct ip_mc_socklist *mc_list; /* Group array */
132 /*
133 * Following members are used to retain the infomation to build
134 * an ip header on each ip fragmentation while the socket is corked.
135 */
136 struct {
137 unsigned int flags;
138 unsigned int fragsize;
139 struct ip_options *opt;
140 struct rtable *rt;
141 int length; /* Total length of all frames */
142 u32 addr;
143 struct flowi fl;
144 } cork;
145 };
146

论坛徽章:
0
发表于 2011-08-18 00:22 |显示全部楼层
回52楼

隐藏内部数据的写法,C的指针擅长描述这种结构,C语言的不带方法的类继承实现
这个函数是附带在sock结构后面的内部数据,
inet_sk(sk)负责起出这个数据,只在内部使用

论坛徽章:
1
天蝎座
日期:2013-12-06 18:23:58
发表于 2011-08-22 07:41 |显示全部楼层
内核编程还是得多下下手~ 源码面前了无秘密!

论坛徽章:
2
巨蟹座
日期:2014-03-09 21:37:25射手座
日期:2014-04-16 16:23:03
发表于 2011-08-27 12:46 |显示全部楼层
讲讲我的个人心得吧,在接触Linux kernel之前,我最开始学习的是《TCP/IP详解卷2》,并结合BSD协议栈源码对照着阅读,个人感觉BSD对协议栈的实现要比Linux更清晰,代码风格也很一致。另外要注意的一点是,在深入内核源码之前,最好先熟悉应用层的网络编程以及和TCP/IP协议相关的RFC文档,千万不要一头栽进内核源码里出不来。等你对应用层网络编程比较熟悉后,再去看内核源码里相关的实现部分。要想了解整个协议栈的实现,netfilter这个框架是绝对跳不开的,但深入netfilter之前,要先掌握iptables的使用,由表及里逐步深入,并尝试修改一下netfilter中的match或target模块,在实践中加深自己对内核的理解和把握。和netfilter相关的文章,网上不是很多,有个blog我强烈推荐,yfydz.cublog.cn,上面的文章我几乎看了个遍,受益匪浅啊!

论坛徽章:
0
发表于 2011-08-27 15:32 |显示全部楼层
虽然我才学习了两个月,担从学linux中我觉得学linux时,首先得学vi或vim,再者就是gcc的使用,还有关键的Makefile,这一切的前提是C语言基础。然后就是不厌其烦的学习了。

论坛徽章:
0
发表于 2011-08-27 15:34 |显示全部楼层
清华大学的linux网络编程这本书也不错啊,很多地方都推荐学习这本书。

论坛徽章:
0
发表于 2011-08-27 15:37 |显示全部楼层
我觉得我们老师说的很对啊,感觉将来的linux网络编程是很好的发展前景,将来的很多电子产品都能连接到互联网上的,这就得需要不少的网络编程人员了。

论坛徽章:
0
发表于 2011-08-29 10:56 |显示全部楼层
物联网很多要用的吧

linux是挺有前途的

论坛徽章:
0
发表于 2011-08-29 11:01 |显示全部楼层
回复 56# kwest


受益了,呵呵

论坛徽章:
0
发表于 2011-09-23 22:21 |显示全部楼层
膜拜大神,终将取而代之
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP