gpt4 book ai didi

c - 使用中间服务器通过 TCP 在 2 个客户端之间传输数据的有效方法

转载 作者:可可西里 更新时间:2023-11-01 02:52:34 26 4
gpt4 key购买 nike

这是出于教育目的(大学作业)。

我需要用 C 语言为 Linux 编写客户端-服务器程序。 (我已经有了那部分。客户端连接到服务器,它可以毫无问题地发送和接收文件...)。

当客户端连接到服务器时,它向服务器发送客户端上的文件列表。所以服务器有一个包含其客户端上所有文件的列表。

客户端A可以向服务器请求一个文件“test.txt”,服务器知道这个文件在客户端B上,应该把文件从B传给A,我在想最好的办法这样做的方式。

  1. 从 B 接收到缓冲区,并立即将缓冲区发送()给 A?
  2. recv()从B传来的整个文件并保存在服务器上,然后发送到 A?

我的程序应该支持这种行为:如果 A 向 B 请求一个文件,然后 C 向 B 请求一个文件,C 不应该等到传输 A<-->B 结束。这就是我卡住的地方。

非常感谢!!

编辑:我的服务器正在使用线程:每当有新客户端连接时,都会打开一个新线程为其提供服务。目前,我的客户端不使用线程(可以更改)。

最佳答案

如果您想使用套接字一次进行多个传输,您有两个选择:

阻塞套接字和线程

这就是您编写服务器的方式。线程的问题在于它们会导致很难调试的错误。将其与本身很难调试的网络错误相结合,您可能面临着一场噩梦般的调试 session 。

非阻塞套接字和 select()

这种方式不需要线程,而是使用 select() 来查看哪些套接字有数据等待读取。将其与一些循环相结合,您可以同时传输多个文件。将套接字设置为非阻塞很容易,使用 correct 可能稍微有点棘手,但要考虑到线程 + 网络错误的可能性,这是我个人更喜欢编写网络代码的方式。

关于你的实际问题;我会建议这样的事情:

Client A connects to server S. You need to bind the local side for the next step.
A also opens another socket for data transfer on the next port upwards.
S sends file list to A. How you build up the file list I leave to you.
A requests file F from S.
S checks which client has F.
S sends "send F to A on port X" to B. You can check which remote port is used, and then you know which port to send the file on.
B recieves and executes the command.

关于c - 使用中间服务器通过 TCP 在 2 个客户端之间传输数据的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13986769/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com