【问题标题】:Socket Programming - Having a process with both client and server code套接字编程 - 拥有一个包含客户端和服务器代码的进程
【发布时间】:2014-06-02 23:03:10
【问题描述】:

我正在编写一个套接字程序,它由一组从属进程组成,这些从属进程将位于计算机集群中的每台机器上,而主进程指示它们将本地文件移动到远程节点上的远程从属进程。这些从属进程的主要任务是从它们的本地硬盘上读取文件并将它们传输到其他机器上的其他从属进程。我希望在单个进程中同时拥有侦听文件数据和发送文件数据的功能。

是否可以在同一个进程中同时拥有发送和接收位?

//I want this to send a connect() request to every other slave node
initialize_Connections();

//Have an accept() call for accepting the connection requests from the other nodes
accept_Connections();

甚至有可能完成这样的事情吗?我查看了 initialize_Connections()accept_Connections() 调用之间的分叉进程(即子进程调用 initialize_Connections() 并且父进程负责 accept_Connections( )) 但由于某种神秘的(对我而言)原因,这并没有奏效。

在这种情况下是否可以使用非阻塞 connect() 和 accept() ?

【问题讨论】:

    标签: c sockets


    【解决方案1】:

    使用线程不是强制性的,您只需要设置一个侦听套接字,该套接字为每个传入连接触发一个套接字,并为连接与其他客户端设置一组套接字,并在每个套接字上为事件池/选择...

    【讨论】:

      【解决方案2】:

      select() 调用允许您在不进入阻塞调用的情况下服务多个套接字。它要求您设置一些由 select() 填充的结构。您反复调用 select(),检查结构以查看读取和/或写入指定套接字之一是否会立即成功。然后,您可以在打开的套接字上调用 read()write(),而不必担心它可能会无限期阻塞。

      【讨论】:

        【解决方案3】:

        我是否可以同时拥有发送和接收位 在同一个过程中?是否可以在此使用非阻塞 connect() 和 accept() 情况?

        是的,当然。您可以使用多个线程执行此操作,也可以仅使用单个线程使用 select() 或 poll() 跨多个套接字多路复用非阻塞 I/O。

        要获得 100% 正确,这些方法都不是微不足道的,但它们是完全可行的。如果您想避免花费大量时间学习(和调试)多连接套接字编程细节,我建议您使用一些为您完成此类事情的中间件,而不是自己动手。我偏爱我自己写的 library 来处理这类事情,但也有 other good ones

        【讨论】:

          【解决方案4】:

          我会让每个从属进程在两个永久线程上执行。在一个线程上,该进程将连接到主进程,然后接收关于将哪个文件发送到其他从属进程的指令。对于指令中的每个其他从属进程,该线程将创建一个临时线程来发送文件。在另一个永久线程上,从属进程将接收来自其他从属进程的连接。对于每个连接,它都会创建一个接收文件的临时线程。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-07-21
            • 1970-01-01
            • 2016-02-06
            • 2013-09-29
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多