繁体   English   中英

如何在客户端服务器应用程序中异步发送文件?(在C中使用winsock2.h)

[英]How can i send files asynchronously in a client-server application?(using winsock2.h, in C)

我想异步发送文件。 我继续发送文件客户端->服务器->另一个客户端,但是如果我要发送很大的文件,则在文件完全发送之前,客户端无法向服务器发送任何其他命令。 对于每个客户端要发送的文件,我创建一个新线程,在该线程中,我将一次读取1kb的文件并发送到服务器,然后服务器将接收到1kb的文件,然后进一步发送给所需的客户端。 问题是,当客户端发送文件时,套接字中已充满了来自服务器的字节。 我应该为每个要发送的文件创建一个客户端服务器套接字? 我已经尝试了一切,但没有成功。

为每次传输创建专用套接字是一种解决方案,除非同时进行连接的数量很大(系统上只有这么多IP端口可用,而服务器将需要两倍),否则这不是一个不好的解决方案。 线程并没有像您想象的那样简化,而是引入了自己的挑战。 select是一种更简单的方法,可以从单个线程/进程在多个套接字上高效地传输数据。 它通过公开底层操作系统对哪些套接字已准备好读取和写入程序的知识而起作用。

无论采用哪种线程选择,使用多路套接字方法给您带来的挑战是,服务器将必须告诉接收者为每次新的传输打开一个新的与服务器的连接。 现在,您需要一个命令mechansim来告诉收件人打开下一个文件的新连接。

另一种选择是仅打开一个套接字,但同时通过该套接字发送多个文件。 您可以通过发送包含每个文件的下一部分的数据结构来实现此目的,而不是直接流式传输文件。 例如,您可能发送的消息看起来像这样(为清晰起见,以JSON呈现,但这将是有效的传输格式):

[ 
  { 
    "name": "file.txt", 
    "bytes": "some smallish chunk of content", 
    "eof": false
  },
  { 
    "name": "another.txt", 
    "bytes": "chunk of another.txt content", 
    "eof": true
  }
]

这个例子当然是天真地简单化了,但希望足以使您理解这个想法:通过构造您要发送的消息,您可以描述哪些文件,哪些字节块属于哪个文件,然后一次发送多个文件块。 由于采用了client-> server-> client方法,这似乎是通往我的最佳途径。

使用类似于以下内容的结构:

struct transferPacket
{
    unsigned packetOfFile;  // = 0 when starting a new file
    unsigned fileNumber;    // incremented with each new file
    unsigned byteCount; 
    char     payload[ MAX_PAYLOAD_LEN ];
};

当packetOfFile == 0时,则启动一个新文件,并且有效载荷包含文件名,否则指示正在传输文件的哪一部分。

当byteCount = 0时,该文件号的EOF

上面只需要一个TCP套接字

一次可以传输多个文件。 接收方知道数据包属于哪个文件,以及有效负载所属的文件位置。

除文件的第一个数据包和EOF数据包或文件的最后一个数据包外,发送方每次发送相同数量的字节

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM