4

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

TCP 服务器:

  • 套接字复用
  • 异步 I/O

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

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

现在我能够将缓冲区从接收器线程提供给调度请求线程,并且在处理第一个客户端特定缓冲区时,接收可以在另一个套接字上继续。

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

请给一些提示,下次如何改进我的问题,谢谢!

4

1 回答 1

2

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

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

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

话虽如此,我还是推荐学习 C++ 和 boost asio(或类似的框架)。它解决了许多与可伸缩性相关的问题,因此重新发明轮子没有意义。

您可以学习《开源应用程序架构》一书(免费提供)。有很多相关示例可能对您有用。

于 2012-12-27T18:18:13.760 回答