TCP的accept发⽣在三次握⼿的哪个阶段?
化妆品经销
叶儿粑这些天在⽹上看到这样⼀个题⽬,据听说是腾讯的⾯试题:
TCP三次握⼿的过程,accept发⽣在三次握⼿的哪⼀个阶段?
答案是:accept过程发⽣在三次握⼿之后,三次握⼿完成后,客户端和服务器就建⽴了tcp连接并可以进⾏数据交互了。
这时可以调⽤accept函数获得此连接。
也许这个图描述的更加清晰。舞狮子作文
image
有的⽹友评论说这个题⽬太简单了,也有⼈说腾讯不会出这么简单的问题,但是就tcp accept⽽⾔你⼜知道多少呢?
我们今天就学习下TCP Accept
POSIX Programmer's Manua对TCP Accept的说明
Accept函数的原型是:
int accept(int socket, struct sockaddr *restrict address,socklen_t *restrict address_len);
功能描述的:
The accept() function shall extract the first connection on the queue of pending connections, create a new socket with the same socket type protocol and address family as the specified socket, and allocate a new file descriptor for that socket.
意思就是:accept函数会从已经建⽴连接的队列中取出第⼀个连接,并创建⼀个新的socket,新的soc
ket的类型和地址参数要和原来的那个指定的socket的地址⼀⼀样,并且还要为这个新的socket分配⽂件描述符。
POSIX Programmer's Manual 还说了这么两句话
三生三世歌词The accepted socket cannot itlf accept more connections. The original socket remains open and can accept more connections.
梦幻西游建房攻略
新建的这个socket⾃⾝是⽆法再接收连接了,但是最开始的那个socket仍然是处于开放状态,⽽且可以接收更多连接。
If the listen queue is empty of connection requests and O_NONBLOCK is not t on the file descriptor for the socket, accept() shall block until a connection is prent. If the listen() queue is empty of connection requests and O_NONBLOCK is t on the file descriptor for the socket, accept() shall fail and t errno to [EAGAIN] or [EWOULDBLOCK].店面销售
祭十二郎文原文及翻译
意思就是:在连接的监听队列为空并且O_NONBLOCK 没有置位的情况下,accpet是阻塞的。如果监听队列为空,但是O_NONBLOCK 置位的情况下,accpet会⽴即返回。
TCP Accept总结
TCP Accept 是三次握⼿以后,Accept正确返回以后TCP Server 可以和Client的连接已建⽴并可以通信了
注意区分listen socket 和 accept socket。
socket分为两种,⼀种套接字正如accept的参数sockfd,它是listen socket,在调⽤listen函数之后,⼀个socket会从主动连接的套接字变为listen 套接字;⽽accept返回是⼀个连接套接字,它代表着⼀个⽹络已经存在的点对点连接。以后的数据交互就是基于这个连接socket ,⽽之前的那个listen socket可以继续⼯作,从⽽接收更多的连接。
枯萎的反义词Accept默认会阻塞进程,直到有⼀个客户连接建⽴后返回