我有一个关于创建顺序套接字管道以在N-Hops路径上转发TCP流的问题(S - - - > M1 - - - > M2 - - - > M3 - - - > D )。目标是S通过TCP套接字将文件发送到D.因此,所有节点M1,M2和M3将以两种模式运行,服务器和客户端除了S和D,它们只能在一种模式下运行。
我的问题是:我可以创建一个套接字管来形成这条路径,这样当M1接收到来自S的第一个数据包时,它会直接将它甩到M2等等(即,不等待任何一个M到收到整个文件,只是发送你立即收到的东西)?并且基于可用的客户端/服务器TCP套接字模型,如果可行,执行此任务需要什么?
答案 0 :(得分:0)
是的,你可以......但是你需要用一个事件循环对每台机器进行编程(即套接字层不会为你做这件事)。
我这样做的方法是让每台机器围绕select()运行一个事件循环,使用一些非阻塞套接字(一个用于传入数据,一个用于传出数据)。每个进程都有一个小的(8kB?)内部缓冲区,用于临时存储它想要转发的一些数据。
然后你的选择循环将按照这些规则运作:
1)每当内部缓冲区小于满时,告诉select(),当传入数据套接字有数据可供您阅读时,您希望得到通知。
2)每当内部缓冲区超过空时,告诉select(),当传出数据套接字已准备好要写入的缓冲区空间时,您希望得到通知。
3)只要select()指示传入数据套接字已准备好您可以读取的数据,请将传入数据套接字中的一些数据读入临时本地缓冲区。 (您读取的数量将受传入数据套接字上可用数据量和本地缓冲区中可用空间量的限制,以较小者为准)
4)每当select()指示您的传出数据套接字具有要写入的缓冲区空间时,请从临时本地缓冲区向传出数据套接字写入一些数据。 (您写入的数量将受到传入数据套接字的数据量和传出套接字当前可以接受的空间量的限制,以较小者为准)
鉴于上述逻辑,字节将以相当流水线的方式从每个节点流向下一个节点。
(错误处理和通过socket()设置套接字,connect()或bind()/ listen()/ accept()这里没有描述,但这也是必要的)