当前位置: 首页 > news >正文

个人网站模板 免费企业网站制作流程

个人网站模板 免费,企业网站制作流程,查询网站注册时间,12306铁路网站开发语言我们继续分析tcp/ip协议的实现,这一篇讲一下accept,accept就是从已完成三次握手的连接队列里,摘下一个节点。我们可以了解到三次握手的实现和过程。很多同学都了解三次握手是什么,但是可能很少同学会深入思考或者看他的实现&#…

我们继续分析tcp/ip协议的实现,这一篇讲一下accept,accept就是从已完成三次握手的连接队列里,摘下一个节点。我们可以了解到三次握手的实现和过程。很多同学都了解三次握手是什么,但是可能很少同学会深入思考或者看他的实现,众所周知,一个服务器启动的时候,会监听一个端口。其实就是新建了一个socket。那么如果有一个连接到来的时候,我们通过accept就能拿到这个新连接对应的socket。那么这个socket和监听的socket是不是同一个呢?其实socket分为监听型和通信型的。表面上,服务器用一个端口实现了多个连接,但是这个端口是用于监听的,底层用于和客户端通信的其实是另一个socket。所以每一个连接过来,负责监听的socket发现是一个建立连接的包(syn包),他就会生成一个新的socket与之通信(accept的时候返回的那个)。我们将会从代码中看到这个实现。
    我们从accept函数开始,详细分析这个过程。


static int sock_accept(int fd, struct sockaddr *upeer_sockaddr, int *upeer_addrlen)
{struct file *file;struct socket *sock, *newsock;int i;char address[MAX_SOCK_ADDR];int len;if (fd < 0 || fd >= NR_OPEN || ((file = current->files->fd[fd]) == NULL))return(-EBADF);// 根据文件描述符找到对应的file结构体和socket结构if (!(sock = sockfd_lookup(fd, &file))) return(-ENOTSOCK);if (sock->state != SS_UNCONNECTED) {return(-EINVAL);}// socket没有调用过listen,报错,该标记位在listen中设置if (!(sock->flags & SO_ACCEPTCON)) {return(-EINVAL);}// 分配一个新的socket结构体if (!(newsock = sock_alloc())) {printk("NET: sock_accept: no more sockets\n");return(-ENOSR);	/* Was: EAGAIN, but we are out of systemresources! */}newsock->type = sock->type;newsock->ops = sock->ops;// 创建一个底层的sock结构体和新的socket结构体互相关联if ((i = sock->ops->dup(newsock, sock)) < 0) {sock_release(newsock);return(i);}// accept返回一个新的sock和socket关联i = newsock->ops->accept(sock, newsock, file->f_flags);if ( i < 0) {sock_release(newsock);return(i);}// 返回一个新的文件描述符if ((fd = get_fd(SOCK_INODE(newsock))) < 0) {sock_release(newsock);return(-EINVAL);}// 是否需要获取socket对应的地址if (upeer_sockaddr){newsock->ops->getname(newsock, (struct sockaddr *)address, &len, 1);move_addr_to_user(address,len, upeer_sockaddr, upeer_addrlen);}return(fd);
}

我们一步步来分析这个函数。
1 通过fd找到对应的socket结构体,然后申请一个新的socket结构体和sock结构体,并且把他们两互相关联。这个在前面的文章分析过。
2 然后把监听的socket和准备用于通信的结构体作为参数,调用accept函数。
3 最后返回通信socket对应的文件描述符。

下面我们开始分析accept函数的真正实现。

static int inet_accept(struct socket *sock, struct socket *newsock, int flags)
{struct sock *sk1, *sk2;int err;sk1 = (struct sock *) sock->data;// 返回一个新的sock结构体sk2 = sk1->prot->accept(sk1,flags);// 互相关联newsock->data = (void *)sk2;sk2->socket = newsock;newsock->conn = NULL;// 设置sock为已经建立连接状态newsock->state = SS_CONNECTED;return(0);
}

这个函数主要是调底层的accept函数,底层accept函数会返回一个新的sock结构体,socket和sock结构体的区别和背景在之前的文章里已经分析过。总的来说,accept函数就是申请一个新的通信socket,这个socket关联了一个新的sock结构体。下面我们看看tcp层的accept函数。

static struct sock *tcp_accept(struct sock *sk, int flags)
{struct sock *newsk;struct sk_buff *skb;// 是一个listen的套接字if (sk->state != TCP_LISTEN) {sk->err = EINVAL;return(NULL); }cli();// 从sock的receive_queue队列摘取已建立连接的节点,while((skb = tcp_dequeue_established(sk)) == NULL) {	// 没有已经建立连接的节点,但是设置了非阻塞模式,直接返回if (flags & O_NONBLOCK) {sti();release_sock(sk);sk->err = EAGAIN;return(NULL);}release_sock(sk);//阻塞进程,如果后续建立了连接,则进程被唤醒的时候,就会跳出while循环interruptible_sleep_on(sk->sleep);}sti();// 拿到一个新的sock结构,由建立连接的时候创建的newsk = skb->sk;// 返回新的sock结构体return(newsk);
}

这个函数主要的逻辑是从监听型socket的已完成三次握手的队列里摘下一个节点。这个节点是一个sk_buff结构体,sk_buff是一个表示网络数据包的数据结构。
在这里插入图片描述
accept函数就分析完了。下一篇我们分析三次握手。看看accept函数摘下的这个节点是如果生成的。

http://www.lbrq.cn/news/2405629.html

相关文章:

  • 企业名录搜索软件终身免费seo提高关键词
  • 平台网站建设公司福州网站优化公司
  • 网络私人定制网站宣传推广
  • 汉狮做网站公司郑州网页制作图片
  • dede学校网站免费源码安卓优化清理大师
  • 做网站的网页设计用cdr吗公司域名注册查询
  • 天津企业网站专业订制搭建网站多少钱
  • 做网购内部优惠券网站百度收录网站入口
  • 用什么软件做网站前端seo顾问是干什么
  • 西安企业网站seo网络推广方式有哪些
  • 国内网站空间免费发布信息网平台
  • 建筑公司企业标语百度seo分析工具
  • 西安设计工作室推荐seo营销方案
  • 有人说做网站赌厦门网
  • 政务门户网站建设方案网站制作河南
  • 网站建设的大概费用站长工具大全集
  • 人工智能写作网站seo优化信
  • 策划书的网站个人怎么注册自己的网站
  • 郑州本地seo顾问搜索排名优化软件
  • 计算机网站建设与管理是什么我想找一个营销团队
  • 网站图片链接怎么做的网站建站模板
  • 网站快照是什么外贸推广平台排名
  • 福州网站怎么做单页网站怎么优化
  • 河北网站开发地推拉新app推广平台有哪些
  • 价格划算的做网站seo推广一个月见效
  • 南宁网站建设 超博网络网络营销网站有哪些
  • 新余做网站公司seo教程技术整站优化
  • 建网站做点什么好南京百度seo
  • 网站开发进度安排文档杭州网站优化搜索
  • 网站建设背景图片站长工具免费
  • 30天打牢数模基础-卷积神经网络讲解
  • 数据存储方案h5py
  • 轻松上手:从零开始启动第一个 Solana 测试节点
  • 在摄像机视图中想像在普通 3D 视口里那样随意移动
  • [每日随题11] 贪心 - 数学 - 区间DP
  • RESTful API设计与实现指南