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

标签 c sockets asynchronous send

我想异步发送文件。我开始发送一个文件客户端->服务器->另一个客户端,但是如果我想发送一个非常大的文件,客户端在文件完全发送之前不能向服务器发送任何其他命令。对于每个客户端想要发送的文件,我创建一个新线程,我将在其中一次读取 1kb 的文件并发送到服务器,然后服务器将接收 1kb 并进一步发送到所需的客户端。问题是当客户端发送文件时,套接字充满了来自服务器的字节。我应该为每个要发送的文件创建一个客户端-服务器套接字吗?我什么都试过了,但没有成功。

最佳答案

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

无论线程选择如何,多套接字方法对您的挑战是服务器必须告诉接收者为每次新传输打开一个返回服务器的新连接。现在你需要一个命令机制来告诉接收者为下一个文件打开一个新的连接。

另一种选择是只打开一个套接字,但通过套接字同时发送多个文件。您可以通过发送包含每个文件的下一部分的数据结构来完成此操作,而不是简单地直接流式传输文件。例如,您可能会发送一条看起来像这样的消息(为清楚起见,以 JSON 格式呈现,但它是一种有效的传输格式):

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

这个例子当然是天真简单,但希望它足以理解这个想法:通过构建你发送的消息,你可以描述哪些文件,哪些字节 block 属于,然后发送多个多个 block 文件一次。由于您的客户端-> 服务器-> 客户端方法,这对我来说似乎是最好的路径。

关于c - 我如何在客户端-服务器应用程序中异步发送文件?(使用 winsock2.h,在 C 中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55300903/

相关文章:

c - 将dll文件和c-exe文件打包到一个文件中

linux - 在 linux 中连接非阻塞套接字的正确方法是什么

c - 来自 recvfrom() 和 AF_PACKET/PF_PACKET 的套接字地址类型

ruby - 在 ruby​​ 程序之间通过互联网发送数据的最快方法?

.net - 提供异步编程模型 : Should I?,如果是,应该是 VerbAsync() 还是 BeginVerb()?

python - Python中的两个独立异步循环

javascript - 如何在javascript中同步调用一组函数

c - NASA C 编码规则 : misuse of pointer

c++ - C/C++ 中的 dlopen 和全局变量

c - 我怎么知道我的程序在哪一步(预处理器、编译、链接)编译失败?