同时有多个客户端,有可能全部要求给服务器发送文件,也有可能要求服务器发送文件。请问应该是 什么样的思路?我现在一对一的可以正常传输,但如果同时有另一台机器,那肯定就有一台不好使。

解决方案 »

  1.   

    这个问题我也想过,难点在于传输协议的定义和套接字的管理。首先你不要把服务器和客户端分的太开,简单的分解为Sender和Receiver即可(两者都可能既扮演服务器又扮演客户端)。做一对一传输的时候,Sender需要知道的Receiver的信息主要就是那个socket,其他的信息和它一起打包成一个结构即可。但是做一对多传输的时候(1 Sender - N Receiver),Sender除了要知道各个Receiver的socket之外,还需要能够区分各个Receiver。如何做到这一点呢?我的思路是需要在发送的数据包中设计一个结构,用于区分不同的传输任务。( 每一个传输任务的格式类似于:ID - IP(Sender) - URL(File) - IP(Receiver) )这点你可以参考下迅雷下载时候的任务属性。首部的ID怎么安排就看个人了。我推荐的做法是采用文件传输的起始时间作为唯一的ID,这样基本可以保证传输任务ID字段的唯一性。当Sender开始向Receiver传输文件块地时候,记录起始时间,添加到数据包中。之后Receiver每收到一块文件,都向Sender回复一个Ack,其中必须包含任务的基本信息(ID - IP(Sender) - URL(File) - IP(Receiver));Sender收到这个Ack之后,提取出任务结构信息,即可进行下一块数据包的发送。把这个做法扩展到N对N的文件传输,你就可以发现思路基本是一样的,不同的地方在于Sender方发送文件和Receiver方接受文件需要提取任务结构的内容进行逻辑判断,从而区分和管理不同的传输任务。当然,每一块文件的传输流程基本都是一样的,差别在于参数信息(Task Structure)。你可以设计成一个单独的模块通过参数传递实现任务的动态绑定。这个做法基本可以满足点对点的文件传输(N Sender - N Receiver)。
      

  2.   

    用套接字数组,socket[n],每有一个客户端连接,服务端就创建一个新的socket[i],针对每一个socket来接收或发送文件数据
      

  3.   

    一个传送建一条传输通道(SOCKET),每个传输通道新建一个线程~
      

  4.   


    这样是不是太复杂了。我其实是想,对于客户端 给服务器的传输,服务器只要 每收到一个消息就开一个线程就接收就完了,之间都不去管它。对于 服务器 给 客户端 也是这样,只不过 我实现的时候 却总是有问题,还不知道是怎么回事,我是新学的,用的CSOCKET,还没弄得很清楚是怎么回事,这个帖子先不结,有问题我在过来问,谢谢大家。
      

  5.   

    不是每一个连接,一个SOCKET吗
    一个连接,同时就只有一个文件传输,只不过是 多个连接 一起传
      

  6.   


    你可以把一个线程想象成一根管道的壳,SOCKET(不是打开端口的而是传输的流)想象成管道中的光纤,文件就是光纤中的数据。
    多个连接可以同时传多个文件(宏观上并行)讲得有点晕,多担待~
      

  7.   

    这个问题用select模型,这几天正在看一个很好的例子,需要代码给一百分,急需分,给你源码,哈哈Q:1023266328
      

  8.   

    overlapi/o 、用完成端口    同时发送 用多播 发送 比较好 
      

  9.   

    c/s结构,服务端开端口监听,客户端用CSocket连接。
    如果连上了,服务端就Accept一个CAsyncSocket,然后就开始传输。
    客户端直接Send,服务端在OnReceive中收。