0

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

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

4

1 回答 1

0

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

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

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

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

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

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

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

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

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

于 2012-06-01T23:56:01.493 回答