Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 编写在服务器上运行的程序,请求有经验的建议_C - Fatal编程技术网

C 编写在服务器上运行的程序,请求有经验的建议

C 编写在服务器上运行的程序,请求有经验的建议,c,C,我正在开发一个需要在Internet服务器上运行的程序(一个由多个跨平台程序使用的后端组件)。我熟悉要采取的安全预防措施(例如,防止缓冲区溢出和SQL注入攻击),但以前从未编写过服务器程序,也没有编写过任何将在这种规模上使用的程序 该计划需要能够同时为数百或数千名客户提供服务。这些协议旨在提高处理速度,减少必须交换的数据量,服务器端将使用C语言编写。将使用相同的代码编写Windows和Linux版本 问题: 程序应该如何处理通信——多个线程,一个线程依次处理所有套接字,或者为每这么多传入连接(

我正在开发一个需要在Internet服务器上运行的程序(一个由多个跨平台程序使用的后端组件)。我熟悉要采取的安全预防措施(例如,防止缓冲区溢出和SQL注入攻击),但以前从未编写过服务器程序,也没有编写过任何将在这种规模上使用的程序

该计划需要能够同时为数百或数千名客户提供服务。这些协议旨在提高处理速度,减少必须交换的数据量,服务器端将使用C语言编写。将使用相同的代码编写Windows和Linux版本

问题:

  • 程序应该如何处理通信——多个线程,一个线程依次处理所有套接字,或者为每这么多传入连接(或每个连接)生成一个新进程
  • 我是否需要担心内存碎片之类的事情,因为这个程序需要一次运行几个月
  • 对于这种编程,有经验的桌面和移动系统跨平台程序开发人员可能不知道还有哪些其他设计问题
请不要建议使用不同的语言。这个决定已经做出了,因为我不能自由讨论。

因为我将使用or和非阻塞I/O。这样操作系统将解决大多数调度问题。我还将使用线程池来处理任务,这些任务本质上是阻塞的,因此它们不会阻塞主循环。如果您需要在光盘上读写大量数据,请再次使用mmap,让操作系统尽可能多地处理这些数据


基本建议是尽可能多地使用操作系统。如果您想要一个很好的程序示例,它可以做到这一点,它编写得非常好,执行起来非常出色。

根据我运行多台服务器超过3年的正常运行时间的经验,对于正常运行时间略超过一年的程序,我仍然建议进行设置,以便系统能够从程序错误和服务器重新启动中正常恢复

即使程序重新启动时性能会受到影响,您也需要能够处理这一问题,因为外部环境可能会迫使程序重新启动


不要试图在不需要的时候重新发明轮子,看看或类似的东西来处理传入通信的分发。(如果允许的话,用一种比类似Python的C语言更宽容的语言对后端进行原型化,然后在
C
中重新实现,但保留通信协议)

因为“这个程序一次需要运行几个月”,如果程序崩溃或出现任何其他问题,最好还有一个单独的监视过程来重新启动程序。“不是建设性的”?它包含三个实际的、可回答的问题,这些问题是基于我所面对的实际问题——根据FAQ的定义,一个好问题的定义。你的问题也应该是。我确信你对使用这样的应用程序使用纯C而不是C++的决定是错误的。我对细节很好奇。我觉得很奇怪,除了为皮处理器和嵌入式系统编程,还发现标准C的捍卫者。@YaK:这个问题有什么没有合理界定范围?我觉得人们根本就没有读过这个问题就做出了判断。谢谢,ZeroMQ似乎正是我所需要的。谢谢你的建议。libevent(和libev)的级别似乎比ZeroMQ(由Anthon建议)低一点,尽管我可能会在其他项目中使用它们。我来看看Varnish,它听起来像是按照我们希望这个程序工作的方式设计的。