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

将文件从网站发送到C应用程序,c,sockets,tcp,ftp,C,Sockets,Tcp,Ftp,我有一个用C编写的简单应用程序,还有一个用node/expressjs构建的网站。C程序位于单独的计算机上,并在不同的网络上运行 目前还没有网络功能,但我希望C程序能够不断地从网站接收文件。它将打开一个阻塞TCP套接字,并且每当接收到文件时,它都会做出适当的响应并处理该文件。C程序没有主动请求任何东西;它只是等待。网站(网站用户)负责通过提交表格的方式发起文件传输。双方通过IP地址和端口连接 我怎样才能开始建立这种沟通?我研究了libcurl,以及FTP和SFTP协议,但我认为它们对于这个任务来

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

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


我怎样才能开始建立这种沟通?我研究了libcurl,以及FTP和SFTP协议,但我认为它们对于这个任务来说是过分的/不合适的。原始TCP套接字可以工作吗?顺便说一下,涉及的文件是图像文件。

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

首先,它必须使用监听插座。这将要求运行应用程序的客户端是DMZ主机,或者为侦听端口设置端口转发。如果您想学习如何打开侦听套接字,这是我在制作服务器时学习的。除了我不确定它为什么使用字符缓冲区之外……我认为uint8\u t更便于移植,所以我使用了它

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

第三,它需要跟踪使用
read
函数的缓冲区中有多少数据可用,并且需要保留一个单独的指针(我们称之为
r_ptr
),指向
read
应该写入的读缓冲区的索引。处理读取缓冲区中的数据后,需要将缓冲区中的其余数据下移到零索引,然后将
r_ptr
设置为该数据最后一个字节后的字节。下次当你的程序想要读取数据时,如果缓冲区中的剩余数据不够,它应该只调用
read
,并且它应该将传入的数据写入剩余数据之后的空间。否则,它可能会丢失传入的数据。考虑这种情况:你的程序等待32个字节到达,但是在你最后一次调用<代码> Read 时收到额外的16个字节,这些字节现在在缓冲区中的某个地方,不会再被“代码> >读< /代码>再次收到。


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

手动TCP套接字似乎是最简单的方法。我不知道我的任务的性质是传统的还是非正统的,所以很高兴知道它在原始套接字编程中是可行的。这是一篇非常有帮助和详细的文章,谢谢!是的,让库为您完成所有原始套接字编程要容易得多;)