2012-06-01 132 views
0

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

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

回答

0

是的,你可以......但你需要用一个事件循环来编程每台机器(即套接字层不会为你做)。

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

那么你的选择 - 循环将这些规则进行操作:

1)每当内部缓冲区低于全,告诉选择()要当输入数据插槽有通知数据准备好供您阅读。

2)只要内部缓冲区大于空值,告诉select(),当传出数据套接字有准备好写入的缓冲区空间时,您希望得到通知。 3)每当select()指示传入数据套接字已准备好供您读取数据时,将传入数据套接字中的一些数据读入临时本地缓冲区。 (您读取的数量将受输入数据套接字上可用数据量和本地缓冲区中可用空间量的限制,以较小者为准)

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

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

(错误处理和建立通过插座(插座),连接()或绑定()/听()/接受(),在此不再赘述,但也将是必要的)

+0

我们可以做这个工作作为一个脚本来运行模块,客户端和服务器?这对我来说似乎很复杂,因为它不是c编程方面的专家!你能帮助设置我可以开始的主体吗? –

+0

你可以,但你必须做你自己的C编程,或雇人来为你做。 –

+0

为什么使用fork()不是正确的选择?服务器将为传入数据分配第一个孩子,第二个孩子用于传出数据,同时等待新连接进入(即,任何节点都可能作为中间人参与许多路径)。 –