我相信我的问题是:
PC 操作系统上是否有一个简单的用户模式 TCP 堆栈,可用于通过有损串行链路与基于 Linux 的设备交换数据?
这里有更多的上下文:
我有一个基于 Linux 的设备通过串行链路连接到 PC。串行链路是有损的,因此有时需要重新传输两个设备之间发送的数据。目前,该系统使用自定义协议(protocol),包括帧、寻址(用于路由到 Linux 设备内的不同进程)和不太健壮的重传算法。
在 Linux 设备端,替换自定义协议(protocol)、在串行链路上实现 SLIP 并使用 TCP 进行所有通信会很方便。问题是在 PC 端,我们不确定如何在不引入我们不需要的一般 IP 路由的情况下使用主机的 TCP 堆栈。如果有可用的用户模式 TCP 堆栈,我似乎可以将其集成到 PC 应用程序中。到目前为止,我发现的唯一 TCP 堆栈是用于微 Controller 的。它们可以被移植,但如果有更现成的东西就更好了。或者是否有一些特殊的方法可以使用操作系统内置的 TCP 堆栈,而无需管理权限或冒 IP 地址与真实以太网接口(interface)冲突的风险。
最后,为了让解决方案专注于 TCP,是的,还有其他解决方案可以解决此问题,例如使用 HDLC 或修复我们的自定义协议(protocol)。但是,我们想进一步探索 TCP 路由,以防它成为一种选择。
最佳答案
看来评论已经回答了你的问题,但也许是为了澄清;不,您不能在不使用 IP 的情况下使用 TCP。 TCP 建立在 IP 之上,它不会以任何其他方式工作。
PPP 是通过串行链路建立 IP 连接的好方法,但如果您在计算机的两端都没有管理访问权限,这可能会很困难。 172.16.x、10.x 和 192.168.x 被定义为对本地网络开放,因此您应该能够找到一组不干扰本地计算机网络操作的 IP 地址。
从无配置、无依赖的角度来看,编写你自己的成帧/重传协议(protocol)应该不会太难,如果你不需要互操作性,这可能是你最好的选择。也就是说,kermit,{z,y,z}调制解调器将提供更好的性能和编码标准。
最后,您可以使用诸如 socat 之类的工具来进行协议(protocol)转换。 IE。将串行流连接到 TCP 端口。这不会解决数据可靠性/重新传输问题,但它可能是您要针对其进行编程的接口(interface)。
关于c - 用于通过有损串行链路重新传输的用户模式 TCP 堆栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14464861/
我有一个模型: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
我主要使用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
尝试通过RVM将RubyGems升级到版本1.8.10并出现此错误:$rvmrubygemslatestRemovingoldRubygemsfiles...Installingrubygems-1.8.10forruby-1.9.2-p180...ERROR:Errorrunning'GEM_PATH="/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/ruby-1.9.2-p180@global:/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/rub
我正在使用puppet为ruby程序提供一组常量。我需要提供一组主机名,我的程序将对其进行迭代。在我之前使用的bash脚本中,我只是将它作为一个puppet变量hosts=>"host1,host2"我将其提供给bash脚本作为HOSTS=显然这对ruby不太适用——我需要它的格式hosts=["host1","host2"]自从phosts和putsmy_array.inspect提供输出["host1","host2"]我希望使用其中之一。不幸的是,我终其一生都无法弄清楚如何让它发挥作用。我尝试了以下各项:我发现某处他们指出我需要在函数调用前放置“function_”……这
鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende
我正在编写一个gem,我必须在其中fork两个启动两个webrick服务器的进程。我想通过基类的类方法启动这个服务器,因为应该只有这两个服务器在运行,而不是多个。在运行时,我想调用这两个服务器上的一些方法来更改变量。我的问题是,我无法通过基类的类方法访问fork的实例变量。此外,我不能在我的基类中使用线程,因为在幕后我正在使用另一个不是线程安全的库。所以我必须将每个服务器派生到它自己的进程。我用类变量试过了,比如@@server。但是当我试图通过基类访问这个变量时,它是nil。我读到在Ruby中不可能在分支之间共享类变量,对吗?那么,还有其他解决办法吗?我考虑过使用单例,但我不确定这是
我的最终目标是安装当前版本的RubyonRails。我在OSXMountainLion上运行。到目前为止,这是我的过程:已安装的RVM$\curl-Lhttps://get.rvm.io|bash-sstable检查已知(我假设已批准)安装$rvmlistknown我看到当前的稳定版本可用[ruby-]2.0.0[-p247]输入命令安装$rvminstall2.0.0-p247注意:我也试过这些安装命令$rvminstallruby-2.0.0-p247$rvminstallruby=2.0.0-p247我很快就无处可去了。结果:$rvminstall2.0.0-p247Search
我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数
我在理解Enumerator.new方法的工作原理时遇到了一些困难。假设文档中的示例:fib=Enumerator.newdo|y|a=b=1loopdoy[1,1,2,3,5,8,13,21,34,55]循环中断条件在哪里,它如何知道循环应该迭代多少次(因为它没有任何明确的中断条件并且看起来像无限循环)? 最佳答案 Enumerator使用Fibers在内部。您的示例等效于:require'fiber'fiber=Fiber.newdoa=b=1loopdoFiber.yieldaa,b=b,a+bendend10.times.m