我是靠谱客的博主 跳跃小甜瓜,最近开发中收集的这篇文章主要介绍linux端实现aoa协议,深入理解TCP/IP协议的实现之listen(基于linux1.2.13),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

listen函数的逻辑比bind还简单。bind主要是校验和绑定ip、端口。listen则是修改socket的状态,并记录一些设置。

static int sock_listen(int fd, int backlog)

{

struct socket *sock;

if (fd = NR_OPEN || current->files->fd[fd] == NULL)

return(-EBADF);

if (!(sock = sockfd_lookup(fd, NULL)))

return(-ENOTSOCK);

if (sock->state != SS_UNCONNECTED)

{

return(-EINVAL);

}

if (sock->ops && sock->ops->listen)

sock->ops->listen(sock, backlog);

// 设置socket的监听属性,accept函数时用到

sock->flags |= SO_ACCEPTCON;

return(0);

}

static int inet_listen(struct socket *sock, int backlog)

{

struct sock *sk = (struct sock *) sock->data;

// 如果没有绑定端口则绑定一个,并把sock加到sock_array中

if(inet_autobind(sk)!=0)

return -EAGAIN;

if ((unsigned) backlog > 128)

backlog = 128;

// tcp接收队列的长度上限,不同系统实现不一样,具体参考tcp.c的使用

sk->max_ack_backlog = backlog;

// 修改socket状态,防止多次调用listen

if (sk->state != TCP_LISTEN)

{

sk->ack_backlog = 0;

sk->state = TCP_LISTEN;

}

return(0);

}

// 绑定一个随机的端口,更新sk的源端口字段,并把sk挂载到端口对应的队列中,见bind函数的分析

static int inet_autobind(struct sock *sk)

{

/* We may need to bind the socket. */

if (sk->num == 0)

{

sk->num = get_new_socknum(sk->prot, 0);

if (sk->num == 0)

return(-EAGAIN);

put_sock(sk->num, sk);

sk->dummy_th.source = ntohs(sk->num);

}

return 0;

}

最后

以上就是跳跃小甜瓜为你收集整理的linux端实现aoa协议,深入理解TCP/IP协议的实现之listen(基于linux1.2.13)的全部内容,希望文章能够帮你解决linux端实现aoa协议,深入理解TCP/IP协议的实现之listen(基于linux1.2.13)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(37)

评论列表共有 0 条评论

立即
投稿
返回
顶部