过去几年我一直在用不同的语言编写许多网络守护进程,现在我要开始一个新项目,它需要一个新的自定义实现专有网络协议(protocol)。
上述协议(protocol)非常简单 - 一些基本的 JSON 格式消息,这些消息在一些基本的帧包装中传输,让客户端知道消息已完全到达并准备好进行解析。
守护进程将需要处理多个连接(同时大约 200 个)并对它们进行一些管理并传递消息,就像在聊天室中一样。
过去我主要使用 C++ 来编写我的守护进程。通常使用 Qt4 框架(网络部分,而不是 GUI 部分!),因为这也是我在其余项目中使用的,而且它简单易行且非常便携。这通常工作得很好,我没有遇到太多麻烦。
作为 Linux 管理员已经有一段时间了,我注意到大多数网络守护进程都是用纯 C 编写的(当然也有一些是用其他语言编写的,但我感觉 > 80%的守护进程是用纯 C 语言编写的)。
现在我想知道为什么会这样。 这是由于纯粹的历史 UNIX 背景(如 KISS)还是为了简单的可移植性或减少膨胀? 不将 C++ 或任何“高级”语言用于守护进程之类的东西的原因是什么?
提前致谢!
对我来说,使用 C++ 通常更方便,因为我有 对象,它们具有 getter 和 setter 方法等。 Plain C 的“上下文”对象在某些时候可能是一个真正的痛苦 - 特别是当您习惯了面向对象的编程时。
是的,我知道C++ 是C 的超集,而C 代码基本上就是C++ 您可以使用C++ 编译器编译任何C 代码。但这不是重点。 ;)
我知道现在使用高级(脚本)语言(如 Python、node.js 或类似语言)可能更有意义。我过去这样做过,而且我知道这样做的好处(至少我希望我知道 ;)- 但这个问题只是关于 C 和 C++。
最佳答案
我个人想不出有任何技术理由选择 C 而不是 C++。无论如何,我无法立即想到一个对位。
编辑回复编辑:我强烈建议您不要考虑“...C 代码基本上是 C++”。尽管从技术上讲,您可以使用 C++ 编译器编译任何 C 程序(只要您不使用 C 中比 C++ 采用的功能更新的任何功能),我真的试图阻止任何人在 C++ 中编写类似 C 的代码或考虑使用 C++作为“带有对象的 C”。
作为对 C 成为 Linux 标准的回应,只有 C 开发人员一直在说:p C++ 与 C 一样成为 Linux 中任何标准的一部分,并且在 Linux 上制作了各种各样的 C++ 程序。如果你正在编写一个 Linux 驱动程序,你需要用 C 来完成它。除此之外......我知道 RMS 喜欢说你更有可能找到 C 编译器而不是 C++ 编译器,但实际上并没有很长一段时间以来都是如此。您会在几乎所有安装中找到两者或两者都没有。
关于可维护性——我当然不同意。
就像我说的,我想不出一个不能立即被反驳的。反之亦然。
关于c++ - 将 C++ 用于网络守护进程有什么缺点吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4704605/
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje
我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',
我正在编写一个gem,我必须在其中fork两个启动两个webrick服务器的进程。我想通过基类的类方法启动这个服务器,因为应该只有这两个服务器在运行,而不是多个。在运行时,我想调用这两个服务器上的一些方法来更改变量。我的问题是,我无法通过基类的类方法访问fork的实例变量。此外,我不能在我的基类中使用线程,因为在幕后我正在使用另一个不是线程安全的库。所以我必须将每个服务器派生到它自己的进程。我用类变量试过了,比如@@server。但是当我试图通过基类访问这个变量时,它是nil。我读到在Ruby中不可能在分支之间共享类变量,对吗?那么,还有其他解决办法吗?我考虑过使用单例,但我不确定这是
它不等于主线程的binding,这个toplevel作用域是什么?此作用域与主线程中的binding有何不同?>ruby-e'putsTOPLEVEL_BINDING===binding'false 最佳答案 事实是,TOPLEVEL_BINDING始终引用Binding的预定义全局实例,而Kernel#binding创建的新实例>Binding每次封装当前执行上下文。在顶层,它们都包含相同的绑定(bind),但它们不是同一个对象,您无法使用==或===测试它们的绑定(bind)相等性。putsTOPLEVEL_BINDINGput