socket(), bind(), listen(),与accept()函数的作用和关系

socket(), bind(), listen(),与accept()函数的作用和关系

socket()函数:

原函数: int accept(int sockfd,struct sockaddr *addr,socklen_t *addrlen);
参数:

  • family指明了协议族/域,通常AF_INET、AF_INET6、AF_LOCAL等;
  • type是套接口类型,主要SOCK_STREAM、SOCK_DGRAM、SOCK_RAW;
  • protocol一般取为0。成功时,返回一个小的非负整数值,与文件描述符类似。

作用: socket函数用于创建一个新的socket,也就是向系统申请一个socket资源。

bind()函数:

原函数int bind(int sockfd,const struct sockaddr* myaddr,socklen_t addrlen)
参数:

  • sockfd 表示socket函数创建的通信文件描述符
  • addrlen 表示所指定的结构体变量的大小
  • addr 表示struct sockaddr的地址,用于设定要绑定的ip和端口

作用:
当用socket()函数创建套接字以后,套接字在名称空间(网络地址族)中存在,但没有任何地址给它赋值。bind()把用addr指定的地址赋值给用文件描述符代表的套接字sockfd。addrlen指定了以addr所指向的地址结构体的字节长度。一般来说,该操作称为“给套接字命名”。调用bind()函数之后,为socket()函数创建的套接字关联一个相应地址,发送到这个地址的数据可以通过该套接字读取与使用。

在套接口中,一个套接字只是用户程序与内核交互信息的枢纽,它自身没有太多的信息,也没有网络协议地址和端口号等信息,在进行网络通信的时候,必须把一个套接字与一个地址相关联,这个过程就是地址绑定的过程。许多时候内核会我们自动绑定一个地址,然而有时用户可能需要自己来完成这个绑定的过程,以满足实际应用的需要,最典型的情况是一个服务器进程需要绑定一个众所周知的地址或端口以等待客户来连接。这个事由 bind的函数完成。

listen()函数:

原函数int listen(int sockfd, int backlog);
listen() 函数的主要作用就是将 socket() 函数得到的 sockfd 变成一个被动监听的套接字, 用来被动等待客户端的连接,而参数 backlog 的作用就是设置连接队列的长度。三次握手,建立连接不是 listen() 函数完成的, 而是内核完成的, listen() 函数只是将 sockfd 和 backlog 告诉内核, 然后就返回了
如果有客户端通过 connect() 发起连接请求, 内核就会通过三次握手建立连接, 然后将建立好的连接放到一个队列中,
这个队列称为: 已完成连接队列
listen函数一般在调用bind之后-调用accept之前调用

accept()函数:

原函数int accept(int sockfd,struct sockaddr *addr,socklen_t *addrlen);
作用
accept() 函数的作用就是在已完成连接队列中取出一个已经建立好的连接。如果这个队列中已经没有已完成连接的套接字, 那么 accept() 就会一直阻塞, 直到取得一个已经建立连接的套接字

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值