【问题标题】:C - sockets - epoll. What with slow clients?C - 套接字 - epoll。慢客户端怎么办?
【发布时间】:2014-10-15 07:25:19
【问题描述】:

上下文

Debian64 位。

我以为我理解套接字的含义,但没有。

担心管理慢客户端。

阅读并修改该代码epoll edge triggered

假设有两个客户: A:网络很慢 B:非常快的网络。

问题

在边沿触发模式下,如果我们开始从 A 读取数据,然后 B 在我们处于 A 的读取循环中时也发送一些数据以读取,会发生什么情况?

B 是否需要等待我们读取所有来自 A 的数据?

或者我们应该创建一个缓冲区(不在给出的示例中)来存储 A 数据并将这些数据连接起来,直到消息完成并立即返回?

或者那个缓冲区已经被 epoll 管理了?

底层我不清楚..

【问题讨论】:

    标签: c sockets epoll


    【解决方案1】:

    网速慢也无所谓,只要读取到目前为止到达服务器的所有数据,读取部分就会停止。

    但其中存在一个错误(或至少是可移植性问题)。该代码仅在读取数据时检查EAGAIN。它还应该检查EWOULDBLOCK,因为某些平台在读取所有数据后会返回该错误代码。

    编辑:

    好的,如果我想将传入的数据放入数据库,我该如何管理它?我可以读取整个数据吗?

    如果您收到不完整的消息,则需要将其存储起来,直到收到整条消息。对于每个带有消息片段的传入连接,我会 malloc char*

    消息完成后,您可以对其进行处理、将其存储在数据库中或任何您想要的。

    请注意,下一条消息的开头可能已经可用,因此在收到EWOULDBLOCKEAGAIN 之前,您不能停止阅读。

    另一种处理问题的方法是为每个连接创建一个单独的线程。 哪种方法最好?嗯,这取决于应用程序(同时用户的数量等)。

    【讨论】:

    • 好的,如果我想将传入的数据放入数据库,我该如何管理呢?我能读取全部数据吗?
    • 谢谢!所以我必须创建一个方法来管理所有 malloc 的数组(指向 malloc 的指针数组)并相应地调用它们,如果似乎没有其他东西可以读取并将其刷新到数据库,对吗?
    • 我会创建一个单独的线程来写入数据库,并通过队列向它发送消息。但这取决于您的要求。您可以在收到完整消息时使用同一线程写入数据库,但这会减慢响应时间,因为服务器必须等待数据库调用完成。
    猜你喜欢
    • 2019-01-17
    • 2018-11-27
    • 1970-01-01
    • 2021-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-10
    • 1970-01-01
    相关资源
    最近更新 更多