Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
File C++中通过TCP套接字管道传输文件_File_Sockets_Tcp_Pipe_Transfer - Fatal编程技术网

File C++中通过TCP套接字管道传输文件

File C++中通过TCP套接字管道传输文件,file,sockets,tcp,pipe,transfer,File,Sockets,Tcp,Pipe,Transfer,我有一个关于创建一个由顺序套接字组成的管道,以通过N个跃点路径S->M1->M2->M3->D转发TCP流的问题。S的目标是通过TCP套接字将文件发送到D。因此,所有节点M1、M2和M3将以两种模式运行,服务器和客户端除外,S和D仅以一种模式运行 我的问题是:我可以创建一个套接字管道来形成这个路径吗?这样,当M1从S接收到第一个数据包时,它将直接转发到M2,以此类推,也就是说,不需要等待任何M来接收整个文件,只需立即发送您接收到的数据包即可?根据可用的客户机/服务器TCP套接字模型,如果可行,执

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


我的问题是:我可以创建一个套接字管道来形成这个路径吗?这样,当M1从S接收到第一个数据包时,它将直接转发到M2,以此类推,也就是说,不需要等待任何M来接收整个文件,只需立即发送您接收到的数据包即可?根据可用的客户机/服务器TCP套接字模型,如果可行,执行此任务需要什么?

是的,您可以。。。但是您需要为每台机器编程一个事件循环来实现这一点,即套接字层不会为您完成这项工作

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

然后,您的select循环将根据以下规则进行操作:

1每当内部缓冲区不足时,告诉select您希望在传入数据套接字具有可供您读取的数据时收到通知

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

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

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

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


错误处理和通过socket、connect或bind/listen/accept设置套接字在此未作说明,但这也是必要的

我们能否将此作业作为一个脚本,同时运行模块、客户端和服务器?这对我来说似乎很复杂,因为我不是c编程专家!你能帮我设置我可以开始的主体吗?你可以,但是你必须自己做C编程,或者雇个人来做。为什么使用fork不是正确的选择?在等待新连接进入时,服务器将为传入数据分叉第一个子节点,为传出数据分叉第二个子节点,也就是说,任何节点都可以作为尽可能多的中间路径参与其中;您知道哪一个将提供更高的性能、更少的延迟、Libevent还是select多路复用?