如何通过套接字发送/接收二进制数据?

Posted

技术标签:

【中文标题】如何通过套接字发送/接收二进制数据?【英文标题】:How to send/receive binary data through sockets? 【发布时间】:2013-04-09 21:08:13 【问题描述】:

我必须编写一个 FTP 服务器,但我对如何传输数据有疑问。

我在 linux 上使用 ftp 命令来测试它,我目前正在处理LIST,它发送工作目录中的文件/目录列表。一切正常(ftp 可以很好地打印文件列表),除了 ftp 打印以下警告:

WARNING! 5 bare linefeeds received in ASCII mode
File may not have transferred correctly.

我想删除该警告,我认为 ftp 期待二进制数据,但我不知道如何通过套接字发送这样的数据,我目前正在做最基本的方法发送ls结果:

dup2(dst_channel, 1);
execlp("ls", "ls", "-l", NULL);

【问题讨论】:

FTP 期望换行符为 CR-LF,但您只是发送 LF。 有没有办法改变它而无需读取命令ls 的结果并将每个 LF 替换为 CR-LF? 【参考方案1】:

FTP 协议规定LIST 命令应以 NETASCII 格式发送其结果,这意味着换行符表示为 CRLF。但是标准的 Linux 程序只输出换行符的 LF。

您需要运行ls 命令,并将其输出连接到管道。您的服务器从管道中读取数据,将任何 \n 字符替换为 `\r\n',然后将其写入套接字。

在传输实际文件时,您需要做类似的事情,除非客户端请求二进制模式。

【讨论】:

另一种方法是实现您自己的ls 代码,该代码以 FTP 期望的格式输出。如果您想在 RFC 3659 中实现 MLSD 命令,则需要这样做。

以上是关于如何通过套接字发送/接收二进制数据?的主要内容,如果未能解决你的问题,请参考以下文章

套接字编程/通过无线发送二进制图像数据

如何使用 NodeMCU 通过 TCP 发送/接收二进制数据?

从 iOS 到 WebSockets 的二进制数据

通过野兽网络套接字发送二进制数据(在 C++ 中)

如何通过 C 中的 HTTP POST 请求发送图像或二进制数据

如何通过WebSocket的二进制发送arraybuffer