c - 在 tcp 服务器中处理客户端缓冲区

标签 c tcp buffer

因为我阅读了很多关于套接字编程的文本和代码,所以我决定这样做:

TCP 服务器:

  • 套接字多路复用
  • 异步输入/输出

我希望能够同时处理 800-1200 个客户端连接。我如何处理客户端缓冲区?我读到的每一个例子都只使用一个单独的缓冲区。为什么人们不使用类似的东西:

typedef struct my_socket_tag {
    socket sock;
    char* buffer;
} client_data;

现在我可以将缓冲区从接收线程分配给分派(dispatch)请求线程,并且在处理第一个客户端特定缓冲区时可以在另一个套接字上继续接收。

这是常见的做法吗?我错过了重点吗?

请指点一下,下次如何改进我的问题,谢谢!

最佳答案

示例通常过于简单化。可扩展性是一个严重的问题,我建议最好从更简单的应用程序开始;处理一千个客户端连接是可能的,但在大多数应用程序中,这需要相当仔细的开发。套接字编程可能会变得棘手。

有不同种类的服务器应用;没有一种方法可以完美地适合所有任务。有很多细节需要考虑(它是面向流或数据报的服务吗?如果有的话,连接是否持久?它涉及大量小数据传输,还是少量大数据传输,或大量大数据传输?等等等等等)。这就是为什么您不太可能在书中看到任何常见示例的原因。

如果选择线程方法,请注意不要创建太多线程;每个客户端一个线程通常(但不总是)是一个糟糕的选择。在某些情况下,您甚至可以在不牺牲任何性能的情况下在单个线程中处理所有内容(使用异步 IO)。

话虽如此,我还是建议学习 C++ 和 boost asio(或类似的框架)。它解决了许多与可扩展性相关的问题,因此没有必要重新发明轮子。

您可以学习开源应用程序架构一书 (freely available)。有很多您可能会发现有用的相关示例。

关于c - 在 tcp 服务器中处理客户端缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14056618/

相关文章:

windows - 使用现有的TCP连接发送数据包

emacs - 在 Emacs 中恢复缓冲区开关上的先前窗口位置

c++ - 为什么 cout 立即输出?

c - 如何从c中的库传递数组

c - || 的评估顺序和 && 在 c 中

c - C中的双重拆分

tcp - 私有(private)化与 SQL Anywhere 16 数据库的连接

c - 使用c中的dll在Labview中处理图像

c# - 如何修复 TCP IP 服务器/客户端应用程序通信

javascript - Chrome 中的完全缓冲视频