【问题标题】:When to send response to client socket何时向客户端套接字发送响应
【发布时间】:2015-12-08 06:14:08
【问题描述】:

我有一个简单的问题,我自己在 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 通信中增加一些显着的延迟。

【问题讨论】:

    标签: sockets network-programming


    【解决方案1】:

    我是否应该在收到请求并处理它后立即向客户端套接字发送响应

    是的。

    或者我应该将客户端套接字添加到 epoll/kqueue 监控并在它告诉我它可用于写入操作时发送响应?

    没有。该操作适用于当send()errno == EAGAIN/EWOULDBLOCK. 返回-1 时,此时套接字发送缓冲区已满,因此您必须排队发送剩余的内容,并在epoll() 告诉您套接字可写时重试.您应该只对在套接字上发生的“可写”事件感兴趣。并且当您重试时,只要您现在可以完成发送,您就应该消除对该套接字的可写性的兴趣。

    【讨论】:

      【解决方案2】:

      是的,您可以在完成客户端请求后立即将响应发送给客户端。但是在发送响应之前有一件事你可以检查客户端的状态。这样你就可以确定客户端是否处于就绪状态

      【讨论】:

      • 也就是说两者兼而有之?你的答案到底是什么?
      • 是的。这是最好的方法。您可以使用返回错误代码检查发送响应的状态。 4xx:客户端错误
      • 哪个最好?这就是他要问的。当你被问到你的意思时,“是”不是一个可以接受的答案。你在这里每条路都有一个鲍勃。除非“检查客户端的状态”是指使用 epoll() 来检查可写性以外的其他内容,在这种情况下,您指的是不存在的内容。
      • @Sree 我不明白 HTTP 4xx 错误如何帮助决定服务器何时应该发送响应。此外,我的问题与套接字编程级别有关(我删除了 HTTP 服务器提及)。此时,epoll/kqueue在返回读/写事件之前,不就是“检查客户端状态”吗?
      猜你喜欢
      • 2014-02-04
      • 1970-01-01
      • 2017-08-11
      • 2018-05-16
      • 2015-03-23
      • 2021-11-09
      • 2013-10-23
      • 1970-01-01
      • 2019-08-25
      相关资源
      最近更新 更多