📄 2_4网络代码阅读笔(4) - china linux forum.htm
字号:
<BR><BR>/* <BR>* Accept a pending connection. The TCP layer now
gives BSD semantics. <BR>*/ <BR>int inet_accept(struct socket *sock,
struct socket *newsock, int flags) <BR>{ <BR>struct sock *sk1 =
sock->sk; <BR>struct sock *sk2; <BR>int err = -EINVAL;
<BR>>>>>调用INET层的accept,即为tcp_accept,返回一个新的struct sock指针
<BR>>>>>这个新的struct sock是当三路握手完成之后,系统建立的, <BR>if((sk2 =
sk1->prot->accept(sk1,flags,&err)) == NULL) <BR>goto
do_err; <BR>lock_sock(sk2);
<BR>BUG_TRAP((1<<SK2->state)&(TCPF_ESTABLISHED|TCPF_CLOSE_WAIT|TCPF_CLOSE));
<BR>>>>>建立sk2与newsock之间的键接关系 <BR>>>>>static
inline void sock_graft(struct sock *sk, struct socket *parent)
<BR>>>>>{ <BR>>>>>
write_lock_bh(&sk->callback_lock); <BR>>>>>
sk->sleep = &parent->wait; <BR>>>>>
parent->sk = sk; <BR>>>>> sk->socket = parent;
<BR>>>>> write_unlock_bh(&sk->callback_lock);
<BR>>>>>} <BR>>>>>这样 struct soket newsock 与
struct sock sk2就是一个完整的内核套接字结构了 <BR>sock_graft(sk2, newsock);
<BR>>>>>置socket的状态为SS_CONNECTED <BR>newsock->state =
SS_CONNECTED; <BR>release_sock(sk2); <BR>return 0; <BR>do_err:
<BR>return err; <BR>} <BR><BR>/* <BR>* This will accept the next
outstanding connection. <BR>*/ <BR>struct sock *tcp_accept(struct
sock *sk, int flags, int *err) <BR>{ <BR>struct tcp_opt *tp =
&sk->tp_pinfo.af_tcp; <BR>struct open_request *req;
<BR>struct sock *newsk; <BR>int error; <BR>lock_sock(sk); <BR>/* We
need to make sure that this socket is listening, <BR>* and that it
has something pending. <BR>*/ <BR>error = -EINVAL; <BR>if
(sk->state != TCP_LISTEN) <BR>goto out; <BR>/* Find already
established connection */
<BR>>>>>对连接已经建立的s套接对,放入accept_queue队列中
<BR>>>>>(以结构struct open_request表示)
<BR>>>>>如果还没有建立连接 <BR>if (!tp->accept_queue) {
<BR>long timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK); <BR>/*
If this is a non blocking socket don't sleep */ <BR>error = -EAGAIN;
<BR>if (!timeo) <BR>goto out;
<BR>>>>>则等待建立连接,wait_for_connect是在分析connect时在说 <BR>error
= wait_for_connect(sk, timeo); <BR>if (error) <BR>goto out; <BR>}
<BR>req = tp->accept_queue;
<BR>>>>>将accept_queue置为下一个open_request。如果只有一个连接,则accept_queue
<BR>>>>>和accept_queue_tail均置为NULL。 <BR>if
((tp->accept_queue = req->dl_next) == NULL)
<BR>tp->accept_queue_tail = NULL;
<BR>>>>>这里req->sk是连接建立的时候分配的struct sock结构 <BR>newsk =
req->sk; <BR><BR>>>>>sk->ack_backlog--;
<BR>tcp_acceptq_removed(sk);
<BR>>>>>kmem_cache_free(tcp_openreq_cachep, req)
<BR>tcp_openreq_fastfree(req); <BR>BUG_TRAP(newsk->state !=
TCP_SYN_RECV); <BR>release_sock(sk); <BR>return newsk; <BR>out:
<BR>release_sock(sk); <BR>*err = error; <BR>return NULL; <BR>}
<BR><BR>※ 修改:·ysqcn 於 07月29日16:47:11 修改本文·[FROM: 202.114.2.11]
<BR><BR><BR>欢迎访问"Unix编程" <BR>telnet apue.dhs.org 2323 <BR>or
http://apue.dhs.org
<P class=small>文章选项: <A
href="http://www.linuxforum.net/forum/printthread.php?Cat=&Board=linuxK&main=147052&type=post"
target=_blank><IMG align=absMiddle alt=打印 border=0
src="2_4网络代码阅读笔(4) - China Linux Forum.files/print.gif"></A>
</P></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE>
<TABLE align=center border=0 cellPadding=4 cellSpacing=0 width="95%">
<TBODY>
<TR>
<TD align=left class=small> </TD>
<TD align=right class=small><A
href="http://www.linuxforum.net/forum/printthread.php?Cat=&Board=linuxK&main=147052&type=thread"
target=_blank><IMG align=top border=0
src="2_4网络代码阅读笔(4) - China Linux Forum.files/printthread.gif"> 打印</A>
</TD></TR></TBODY></TABLE><BR>
<TABLE align=center border=0 cellPadding=0 cellSpacing=0 width="95%">
<TBODY>
<TR>
<TD class=tableborders>
<TABLE border=0 cellPadding=3 cellSpacing=1 width="100%">
<TBODY>
<TR class=darktable>
<TD align=right>
<TABLE border=0>
<TBODY>
<TR>
<TD class=navigation noWrap><IMG align=absMiddle alt=*
src="2_4网络代码阅读笔(4) - China Linux Forum.files/greyflat.gif">平坦模式
</TD>
<TD class=navigation noWrap><A
href="http://www.linuxforum.net/forum/showthreaded.php?Cat=&Board=linuxK&Number=147052&page=120&view=collapsed&sb=5&o=all&vc=1"><IMG
align=absMiddle alt=树状模式,一封一封读 border=0
src="2_4网络代码阅读笔(4) - China Linux Forum.files/threaded.gif">树状模式</A>
</TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE>
<TABLE align=center border=0 cellPadding=0 cellSpacing=0 width="95%">
<TBODY>
<TR>
<TD align=right>
<FORM action=http://www.linuxforum.net/forum/jumper.php method=post><INPUT
name=Cat type=hidden> <SPAN class=onbody>前往讨论区 </SPAN><SELECT
class=formboxes name=board> <OPTION value=-CATJUMP-1>*Linux 社区和文化*
-----<OPTION value=new> 社区公告栏<OPTION
value=uglyduck> 社区服务台<OPTION
value=linuxnews> 业界新闻与评论<OPTION
value=linuxtalk> 自由软件杂谈<OPTION
value=software> Linux软件快递<OPTION
value=Tworkshop> 中文MAN-PAGE计划(CMPP)<OPTION
value=tcl> Linux图书与评论<OPTION
value=job> 招聘和求职<OPTION value=-CATJUMP-2>*Linux
桌面与办公自动化* -----<OPTION value=chinese> Linux
中文环境和中文化<OPTION value=office> Linux桌面与办公软件<OPTION
value=game> Linux 多媒体与娱乐版<OPTION
value=mozilla> 自由之窗Mozilla<OPTION
value=laptop> 笔记本电脑上的Linux<OPTION
value=-CATJUMP-3>*Linux 入门及网络应用* -----<OPTION
value=debian> Debian 一族<OPTION
value=nm> 网络管理技术<OPTION
value=newbie> Linux 安装与入门<OPTION
value=web> WEB服务器和FTP服务器<OPTION
value=dns> 域名服务器和邮件服务器<OPTION
value=proxy> Linux防火墙和代理服务器应用<OPTION
value=samba> 文件及打印服务器<OPTION
value=training> 技术培训与认证<OPTION value=-CATJUMP-4>*Linux
高级应用* -----<OPTION selected
value=linuxK> Linux内核技术<OPTION
value=embedded> 嵌入开发推进计划 (OpenARM)<OPTION
value=driver> Linux设备驱动程序<OPTION
value=cluster> Linux 集群技术<OPTION
value=db> LINUX平台数据库<OPTION
value=cpu> CPU 与 编译器<OPTION
value=security> 系统和网络安全<OPTION value=-CATJUMP-5>*Linux
环境下的程序设计* -----<OPTION
value=kylix> LINUX下的快速开发工具(RAD)<OPTION
value=program> C/C++编程版<OPTION
value=php3> PHP 技 术<OPTION
value=java> Java&jsp技术<OPTION
value=vrml> Shell编程技术<OPTION
value=perl> Perl 编 程<OPTION
value=python> Python 编 程<OPTION
value=xml> XML/Web Service 技术<OPTION
value=-CATJUMP-6>*永远的 UNIX* -----<OPTION
value=unix> 永远的Unix<OPTION
value=bsd> FreeBSD世界<OPTION value=-CATJUMP-7>*IT 人生*
-----<OPTION value=life> IT 人生</OPTION></SELECT> <INPUT class=buttons name=Jump type=submit value=出发>
</FORM></TD></TR></TBODY></TABLE>
<P>
<TABLE align=center border=0 cellPadding=0 cellSpacing=0 width="95%">
<TBODY>
<TR>
<TD class=tableborders>
<TABLE border=0 cellPadding=3 cellSpacing=1 width="100%">
<TBODY>
<TR class=darktable>
<TD>
<TABLE border=0 cellPadding=0 cellSpacing=0 width="100%">
<TBODY>
<TR>
<TD align=left><A href="mailto:davidd@linuxforum.net">Contact
Us</A> </TD>
<TD align=right><A
href="http://www.linuxforum.net/">LINUXFORUM.NET</A>
</TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></P></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -