在TCP服务器中处理客户端缓冲区

4

由于我阅读了大量关于套接字编程的文本和代码,我决定按照以下方式进行:

TCP服务器:

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

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

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

现在我能够将缓冲区从接收线程分配给调度请求线程,而在处理第一个客户端特定的缓冲区时,接收可以在另一个套接字上继续进行。

这是常见做法吗?我有什么遗漏的地方吗?

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


2
没有什么可说的,示例有时是错误的,设计更简单,因为这只是一个例子... 使用从堆中分配或从静态数组(固定大小等于最大连接数)获取的结构体是一个好主意。 - benjarobin
1个回答

2
这些示例通常过于简化。可扩展性是一个严重的问题,我建议最好从更简单的应用程序开始;处理一千个客户端连接是可能的,但在大多数应用程序中,这将需要非常谨慎的开发。套接字编程可能会变得棘手。
有不同种类的服务器应用程序;没有一种单一的方法能完美地适用于所有任务。有许多细节要考虑(是流还是数据报导向服务?如果有连接,是否持久?它涉及大量小数据传输、少量巨大传输还是大量巨大传输等等)。这就是为什么你不太可能在书籍中看到任何共同的例子。
如果选择线程方法,请注意不要创建太多线程;每个客户端一个线程通常(但并不总是)是一个糟糕的选择。在某些情况下,您甚至可以在单个线程中处理所有内容(使用异步IO),而不会牺牲任何性能。
话虽如此,我建议学习C++和boost asio(或类似的框架)。它解决了许多与可扩展性相关的问题,因此没有必要重新发明轮子。
您可以学习《开源应用程序架构》一书的架构(免费提供)。其中有一些相关的示例可能会对您有用。

首先感谢您提供的书籍链接。我之前还没有听说过这本书。 - stackofervlow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接