【问题标题】:Sending a file from website to C application [closed]将文件从网站发送到 C 应用程序 [关闭]
【发布时间】:2014-07-21 02:06:15
【问题描述】:

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

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

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

【问题讨论】:

    标签: c sockets tcp ftp


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 手动 TCP 套接字似乎是最直接的方法。我不知道我的任务的性质是传统的还是非正统的,所以很高兴知道它可以通过原始套接字编程来实现。一个非常有用和详尽的帖子,谢谢!
    • 是的,让库为您完成所有原始套接字编程要容易得多;)
    猜你喜欢
    • 2012-11-23
    • 2019-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-13
    • 1970-01-01
    相关资源
    最近更新 更多