将文件从网站发送到C应用程序

时间:2014-07-21 02:06:16

标签: c sockets tcp ftp

我有一个用C编写的简单应用程序,以及一个用node / expressjs构建的网站。 C程序位于单独的计算机上并在不同的网络上运行。

目前还没有网络功能,但我希望C程序做的是不断从网站接收文件。它会打开一个阻塞的TCP套接字,每当收到一个文件时,它都会适当地响应并处理文件。 C程序没有主动请求任何东西;它只是等待。网站(网站用户)负责通过表单提交启动文件传输。双方通过IP地址和端口连接。

我该如何建立这种沟通?我查看了libcurl,以及FTP和SFTP协议,但我认为它们对于此任务来说是过度/不适合的。原始TCP套接字可以工作吗?顺便说一下,涉及的文件是图像文件。

1 个答案:

答案 0 :(得分:0)

原始TCP套接字可以工作,但我不知道这是否是你想要使用的。它涉及到您的许多低级设置。您的客户端应用程序更像是服务器。

首先,它必须使用监听套接字。这将要求运行应用程序的客户端是DMZ主机或为侦听端口设置端口转发。如果你想学习如何打开一个监听套接字,我在制作服务器时学到了here is a good example。除了我不确定它为什么使用char缓冲区...我认为uint8_t更便携,所以我改用它。

其次,您需要建立自己的包装所发送数据的系统。您可能知道,当您调用read时,TCP数据将显示为连续流,因此您需要确保您的网站在每个文件之前发送一个大小标题,以便您的应用程序知道何时停止阅读。在前4个字节中发送标题将允许您发送高达4GiB的文件(调整所需的最大文件大小),但如果您需要发送任意大小的文件并且不担心恶意连接,请使用{ {3}}标题。

第三,需要跟踪使用read函数的缓冲区中可用的数据量,并且需要保留一个单独的指针(让我们称之为r_ptrread应写入的读缓冲区的索引。在读缓冲区中处理数据后,需要将缓冲区中的其余数据向下移至零索引,然后将r_ptr设置为该数据的最后一个字节后的字节。下次你的程序想要读取数据时,如果缓冲区中的剩余数据不够,它应该只调用read,它应该在剩余数据之后将输入数据写入空间。否则,它可能会丢失传入的数据。考虑这种情况:您的程序等待32个字节到达,但在您上次调用read时收到额外的16个字节,这些字节现在位于缓冲区中的某个位置,并且不会再使用{{ 1}}。

最后,如果您希望程序一次接受多个连接,您可能希望在自己的线程中处理每个客户端。这是最简单的方法,但我不知道它是否最有效。