草庐IT

您可以将 TCP 连接从一个进程传递到另一个进程吗?

coder 2023-06-20 原文

我正在做一些网络测试,我正在用两个只使用函数的小 C 程序连接 linux 机器:

connect()

连接后,进行了一些小计算并将其记录到本地文件中,我指示其中一个程序关闭连接,然后在同一端口上运行 netcat 监听器。然后第一个程序重试连接并连接到 netcat。

我想知道是否有人可以建议是否可以在释放端口的同时保持初始连接并将连接传递给该端口上的 netcat(这样初始连接就不会关闭)。

最佳答案

每个 TCP 连接都由四元组(目标 IP 地址、目标端口、源 IP 地址、源端口)定义,因此无需“释放”任何一台机器上的端口。

服务器进程在 accept() 建立新连接后立即 fork() 是很常见的。父进程关闭它的连接描述符副本(由 accept() 返回),并等待新的连接。子进程关闭原始套接字描述符,并执行应处理实际连接的所需程序或脚本。在许多情况下, child 将连接描述符移动到标准输入和标准输出(使用 dup2()),这样执行的脚本或程序甚至不需要知道它连接到远程客户端:它写入标准输出的所有内容都会发送到远程客户端,而远程客户端发送的所有内容都可以从标准输入读取。

如果存在应处理连接的现有进程,并且两个进程之间存在 Unix 域套接字连接(流、数据报或 seqpacket 套接字;没有区别),则可以将连接描述符作为SCM_RIGHTS 辅助消息。参见 man 2 sendmsg , man 2 recvmsg , man 3 cmsg , 和 man 7 unix了解详情。这仅适用于同一台机器上的 Unix 域套接字,因为内核实际上复制描述符从一个进程到另一个;真的,内核做了一些时髦的魔法来实现这一点。

如果你的服务器端逻辑是这样的

  • 对于每个传入连接:
    1. 做一些计算
    2. 将计算存储到文件中
    3. 将来自连接的传入数据存储到文件(或标准输出)

那么我推荐使用pthreads。只需创建所需数量的线程,通过在监听套接字上调用 accept() 让所有线程等待传入连接,并让每个线程自己处理连接。您甚至可以将 stdio.h I/O 用于文件 I/O。对于更复杂的输出——每个 block 有多个语句——,每个输出流都需要一个 pthread_mutex_t,并记住在释放互斥量之前对它执行 fflush()。我怀疑一个单一的多线程程序可以完成所有这些工作,并且如果被中断(SIGINT 又名 CTRL+C)会很好地退出,不应超过三百行 C。

关于您可以将 TCP 连接从一个进程传递到另一个进程吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18936614/

有关您可以将 TCP 连接从一个进程传递到另一个进程吗?的更多相关文章

  1. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类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

  2. ruby - 使用 Vim Rails,您可以创建一个新的迁移文件并一次性打开它吗? - 2

    使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta

  3. ruby-on-rails - Rails - 一个 View 中的多个模型 - 2

    我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何

  4. ruby-on-rails - 渲染另一个 Controller 的 View - 2

    我想要做的是有2个不同的Controller,client和test_client。客户端Controller已经构建,我想创建一个test_clientController,我可以使用它来玩弄客户端的UI并根据需要进行调整。我主要是想绕过我在客户端中内置的验证及其对加载数据的管理Controller的依赖。所以我希望test_clientController加载示例数据集,然后呈现客户端Controller的索引View,以便我可以调整客户端UI。就是这样。我在test_clients索引方法中试过这个:classTestClientdefindexrender:template=>

  5. ruby - 我可以使用 Ruby 从 CSV 中删除列吗? - 2

    查看Ruby的CSV库的文档,我非常确定这是可能且简单的。我只需要使用Ruby删除CSV文件的前三列,但我没有成功运行它。 最佳答案 csv_table=CSV.read(file_path_in,:headers=>true)csv_table.delete("header_name")csv_table.to_csv#=>ThenewCSVinstringformat检查CSV::Table文档:http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV/Table.html

  6. ruby - 在 jRuby 中使用 'fork' 生成进程的替代方案? - 2

    在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',

  7. ruby - 续集在添加关联时访问many_to_many连接表 - 2

    我正在使用Sequel构建一个愿望list系统。我有一个wishlists和itemstable和一个items_wishlists连接表(该名称是续集选择的名称)。items_wishlists表还有一个用于facebookid的额外列(因此我可以存储opengraph操作),这是一个NOTNULL列。我还有Wishlist和Item具有续集many_to_many关联的模型已建立。Wishlist类也有:selectmany_to_many关联的选项设置为select:[:items.*,:items_wishlists__facebook_action_id].有没有一种方法可以

  8. ruby - 通过 ruby​​ 进程共享变量 - 2

    我正在编写一个gem,我必须在其中fork两个启动两个webrick服务器的进程。我想通过基类的类方法启动这个服务器,因为应该只有这两个服务器在运行,而不是多个。在运行时,我想调用这两个服务器上的一些方法来更改变量。我的问题是,我无法通过基类的类方法访问fork的实例变量。此外,我不能在我的基类中使用线程,因为在幕后我正在使用另一个不是线程安全的库。所以我必须将每个服务器派生到它自己的进程。我用类变量试过了,比如@@server。但是当我试图通过基类访问这个变量时,它是nil。我读到在Ruby中不可能在分支之间共享类变量,对吗?那么,还有其他解决办法吗?我考虑过使用单例,但我不确定这是

  9. ruby - 我可以使用 aws-sdk-ruby 在 AWS S3 上使用事务性文件删除/上传吗? - 2

    我发现ActiveRecord::Base.transaction在复杂方法中非常有效。我想知道是否可以在如下事务中从AWSS3上传/删除文件:S3Object.transactiondo#writeintofiles#raiseanexceptionend引发异常后,每个操作都应在S3上回滚。S3Object这可能吗?? 最佳答案 虽然S3API具有批量删除功能,但它不支持事务,因为每个删除操作都可以独立于其他操作成功/失败。该API不提供任何批量上传功能(通过PUT或POST),因此每个上传操作都是通过一个独立的API调用完成的

  10. ruby-on-rails - 如果 Object::try 被发送到一个 nil 对象,为什么它会起作用? - 2

    如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象

随机推荐