我有一个简单的问题,我自己在Google上搜索无法解决,希望你能帮助我。
我正在编写网络应用程序服务器并使用epoll / kqueue来处理连接。
我应该在收到请求并处理后立即向客户端套接字发送响应,还是应该将客户端套接字添加到epoll / kqueue监控并在它告诉我可以写入操作时发送响应?
实施例。 (伪代码)。我应该这样做:
while(true) {
epoll/kqueue check for events
if(triggered event is server listening socket) {
accept() new socket
add it to epoll/kqueue monitoring
} else //triggered event is client socket
if(event is read) {
recv() request and process it
send() response //!!!!!!!!!!!!!!!!!!
} else
...
}
或者这个:
while(true) {
epoll/kqueue check for events
if(triggered event is server listening socket) {
accept() new socket
add it to epoll/kqueue monitoring
} else //triggered event is client socket
if(event is read) {
recv() request and process it
add client socket to epoll/kqueue monitoring
} else if(event is write)
send() previously processed response //!!!!!!!!!!!!!!!
else
...
}
在我以前的简单套接字实验中,响应在请求处理时尽快发送,就像第一次伪代码显示一样,但由于延迟,浏览器连接数限制,我不知道它是否在真实环境中工作相同等等。
因此在第二个伪代码中使用它是有道理的,但我不知道是否必须等待epoll / kqueue告诉客户端套接字是否准备好进行写操作会在TCP通信中增加一些重要的延迟。 / p>
答案 0 :(得分:2)
我应该在收到请求并处理后立即向客户端套接字发送响应
是
或者我应该在epoll / kqueue监视中添加客户端套接字并在它告诉我它可以写入操作时发送响应吗?
没有。该操作适用于let holderViewCenterXConstraint = NSLayoutConstraint(item:
self.holderView, attribute: NSLayoutAttribute.CenterX, relatedBy: NSLayoutRelation.Equal, toItem: self, attribute: NSLayoutAttribute.CenterX, multiplier: 1.0, constant: 0)
let holderViewCenterYConstraint = NSLayoutConstraint(item: self.holderView, attribute: NSLayoutAttribute.CenterY, relatedBy: NSLayoutRelation.Equal, toItem: self, attribute: NSLayoutAttribute.CenterY, multiplier: 1.0, constant: 0)
返回-1且send()
的情况。此时套接字发送缓冲区已满,因此您必须对剩余的发送进行排队,并在errno == EAGAIN/EWOULDBLOCK.
时再次尝试告诉你套接字是可写的。你应该只对可写的'感兴趣。在套接字上发生此事件时的事件。当你重试时,只要你现在可以完成发送,你应该删除对该套接字的可写性的兴趣。
答案 1 :(得分:-1)
是的,您可以在完成客户端请求后立即将响应发送给客户端。但在发送响应之前,您可以检查客户端的状态。因此,您可以确保客户端是否处于就绪状态