我正在编写一个名为当天引用的C ++服务器端应用程序。我正在使用winsock2库。我想通过使用send函数将文件的内容发送回客户端,包括换行符。我尝试它的方式不起作用。我该怎么做呢?
答案 0 :(得分:3)
读取文件并写入套接字是两个不同的操作。 Winsock does not have an API用于直接发送文件。
至于阅读文件,如果使用fopen,只需确保以读二进制模式打开它,或者只使用CreateFile和ReadFile Win32 API,默认情况下它将是二进制模式。
通常,您将以块的形式读取文件(例如,一次10KB),然后使用send或WSASend通过套接字发送每个块。完成后,您可以关闭套接字。
在接收方,读取插座上可用的内容,直到插座关闭。在将数据读入缓冲区时,将读取的数量写入文件。
答案 1 :(得分:0)
嗯......我认为Win32在Linux中应该有类似于“sendfile”的东西。 如果不是,您仍然可以使用memory-mapping(但是,不要忘记处理大小大于可用虚拟地址空间的文件)。您可能需要使用阻塞套接字以避免在消耗所有数据之前返回应用程序。我认为有一些“重叠”操作来实现异步IO。
答案 2 :(得分:0)
我建议删除winsock,而是使用更现代的东西,比如Boost.Asio:
http://www.boost.org/doc/libs/1_37_0/doc/html/boost_asio/tutorial.html
还有一个传输文件的例子:
http://www.boost.org/doc/libs/1_37_0/doc/html/boost_asio/examples.html