【问题标题】:File Transfer via TCP socket Pipe in C++在 C++ 中通过 TCP 套接字管道传输文件
【发布时间】:2012-06-01 18:30:36
【问题描述】:

我有一个关于创建顺序套接字管道以通过 N-Hops 路径(S - - - > M1 - - - > M2 - - - > M3 - - - > D)转发 TCP 流的问题。 S 的目标是通过 TCP 套接字将文件发送到 D。因此,所有节点 M1、M2 和 M3 将在两种模式下运行,服务器和客户端,除了 S 和 D,它们将仅在一种模式下运行。

我的问题是:我可以创建一个套接字管道来形成这条路径,以便 M1 从 S 接收第一个数据包,它将直接转发到 M2 等等(即,无需等待任何 M收到整个文件,立即发送您收到的任何内容)?并且基于可用的客户端/服务器 TCP 套接字模型,如果可行,执行此任务需要什么?

【问题讨论】:

    标签: file sockets tcp pipe transfer


    【解决方案1】:

    是的,您可以...但您需要使用事件循环对每台机器进行编程(即套接字层不会为您执行此操作)。

    我的做法是让每台机器围绕 select() 运行一个事件循环,使用几个非阻塞套接字(一个用于传入数据,一个用于传出数据)。每个进程都有一个小的(8kB?)内部缓冲区,用于临时存储一些它想要转发的数据。

    然后您的选择循环将按照以下规则运行:

    1) 每当内部缓冲区未满时,告诉 select() 您希望在传入数据套接字有数据可供您读取时收到通知。

    2) 每当内部缓冲区超过空时,告诉 select() 您希望在传出数据套接字有缓冲区空间可供您写入时收到通知。

    3) 每当 select() 向您指示传入数据套接字有数据可供您读取时,将一些数据从传入数据套接字读取到您的临时本地缓冲区中。 (您读取的数量将受到传入数据套接字上可用数据量和本地缓冲区中可用空间量的限制,以较小者为准)

    4) 每当 select() 向您指示传出数据套接字有缓冲区空间可写入时,从您的临时本地缓冲区将一些数据写入传出数据套接字。 (您写入的数量将受到传入数据套接字的数据量和传出套接字当前可以接受的空间量的限制,以较小者为准)

    鉴于上述逻辑,字节将以相当流水线的方式从每个节点流向下一个节点。

    (错误处理和通过 socket()、connect() 或 bind()/listen()/accept() 设置套接字在这里没有描述,但这也是必要的)

    【讨论】:

    • 我们能否将这项工作作为一个脚本来同时运行模块、客户端和服务器?对于我不是 c 编程专家来说,这似乎很复杂!你能帮忙设置一下我可以从哪里开始的主体吗?
    • 您可以,但您必须自己进行 C 编程,或者请人为您完成。
    • 为什么使用 fork() 不是正确的选择?服务器将分叉第一个子节点用于传入数据,第二个子节点用于传出数据,同时等待新的连接进入(即,任何节点都可以作为中间节点参与到许多路径中)。
    • 我找到了另一种做非阻塞套接字的方法,叫做 Libevent;你知道哪一个会提供更高的性能“更少的延迟”,Libevent 还是 select() 多路复用?
    猜你喜欢
    • 1970-01-01
    • 2012-07-12
    • 1970-01-01
    • 1970-01-01
    • 2017-11-03
    • 2012-09-07
    • 2018-01-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多