运用listen()和accept()函数
yuw20170人评论825人阅读2016-08-29 10:31:21
关于效劳器端程序,运用 bind() 绑定套接字后,还需求运用 listen() 函数让套接字进入主动监听形态,再挪用 accept() 函数,就可以随时呼应客户端的恳求了。
listen() 函数
经过 listen() 函数可以让套接字进入主动监听形态,它的原型为:
int listen(int sock, int backlog); //Linux int listen(SOCKET sock, int backlog); //Windows
sock 为需求进入监听形态的套接字,backlog 为恳求队列的最大长度。
所谓主动监听,是指当没有客户端恳求时,套接字处于“睡眠”形态,只要当接纳到客户端恳求时,套接字才会被“叫醒”来呼应恳求。
恳求队列
当套接字正在处置客户端恳求时,假如有新的恳求出去,套接字是没法处置的,只能把它放进缓冲区,待以后恳求处置终了后,再从缓冲区中读掏出来处置。假如不时有新的恳求出去,它们就依照先后次序在缓冲区中列队,直到缓冲区满。这个缓冲区,就称为恳求队列(Request Queue)。
缓冲区的长度(能寄存若干个客户端恳求)可以经过 listen() 函数的 backlog 参数指定,但终究为若干并没有什么规范,可以依据你的需求来定,并发量小的话可所以10或许20。
假如将 backlog 的值设置为 SOMAXCONN,就由零碎来决议恳求队列长度,这个值普通比拟大,能够是几百,或许更多。
当恳求队列满时,就不再接纳新的恳求,关于 Linux,客户端会收到 ECONNREFUSED 毛病,关于 Windows,客户端会收到 WSAECONNREFUSED 毛病。
留意:listen() 只是让套接字处于监听形态,并没有接纳恳求。接纳恳求需求运用 accept() 函数。
accept() 函数
当套接字处于监听形态时,可以经过 accept() 函数来接纳客户端恳求。它的原型为:
int accept(int sock, struct sockaddr *addr, socklen_t *addrlen); //Linux SOCKET accept(SOCKET sock, struct sockaddr *addr, int *addrlen); //Windows
它的参数与 listen() 和 connect() 是相反的:sock 为效劳器端套接字,addr 为 sockaddr_in 构造体变量,addrlen 为参数 addr 的长度,可由 sizeof() 求得。
accept() 前往一个新的套接字来和客户端通讯,addr 保管了客户端的IP地址和端标语,而 sock 是效劳器端的套接字,人人留意辨别。前面和客户端通讯时,要运用这个重生成的套接字,而不是本来效劳器端的套接字。
最初需求阐明的是:listen() 只是让套接字进入监听形态,并没有真正接纳客户端恳求,listen() 前面的代码会持续履行,直到碰到 accept()。accept() 会壅塞程序履行(前面代码不克不及被履行),直到有新的恳求到来。0daybank
文章评论