如何在ftp服务器/客户端将数据发送到TCP套接字之前从其获取数据
how to get data from a ftp server/client before it sends it data to TCP socket
在我的程序中,在FTP服务器/客户端将数据发送到TCP套接字之前,我需要从它获取数据,在获取数据之后,我必须将8字节的数据(将在负载开始时添加)附加到它,然后将其恢复到TCP套接字。这可能吗?我在网上搜索没有运气
正如Pragnesh所建议的,使用cURL库。然而,使用cURL意味着它将创建数据包并通过套接字发送数据包。您可以尝试以下两种方法
-
第一个选项是修改cURL代码本身,以便在将数据包写入套接字之前对其进行修改。但这需要对FTP库有一个很好的理解,并重新编译整个代码。这是可能的,但不是一个巧妙的方法。
-
第二种方法的工作原理如下a.允许库(cURL或任何其他库)创建协议包并将其写入套接字。但是,当您将FTP服务器IP传递给库时,传递一个假IP(这是一个临时IP,稍后将被替换),例如10.1.1.5。
b。创建一个虚拟设备(TUN设备是标准linux发行版的一部分),并将FTP协议包写入IP层的虚拟设备。为此,添加一个新的路由表条目,该条目指出,对于目的地IP为假IP的数据包(在这种情况下为10.1.1.5),目的地设备应为TUN设备。因此,每次FTP协议包到达目的地IP为10.1.1.5的IP层时,它都会被写入虚拟设备,而不是从机器中发送出去。
c。在应用程序中,使用read()命令侦听虚拟设备。写入到虚拟设备上的所有数据包都在应用程序处接收。接收到的数据包是"FTP over TCP over IP"数据包。这意味着它将具有FTP协议数据包、TCP报头和IP报头。
d。现在,你可以用这个包做任何你想要的事情。在您的情况下,只需在缓冲区中获得正确的偏移量(IP和TCP标头的大小是固定的),然后添加您的数据。一旦修改了数据包,就必须更改两个IP地址。此IP数据包中的源IP地址是虚拟设备IP地址,而不是您的eth0地址。因此,请将此源IP替换为您的eth0地址。数据包中的目标IP地址是假IP。再次将此地址替换为正确的FTP服务器IP。
e。完成后,重新计算IP和TCP标头校验和。(这些都是很容易找到的标准算法)。在此之后,最后一件事是使用write()命令在虚拟设备上再次写入数据包。一旦你这样做,数据包将被注入IP层,这一次将从机器中取出。您必须设置IP转发标志并禁用rp筛选器设置。
希望这能有所帮助。
- 通过套接字[TCP]传输数据 如何在C / C ++中打包多个整数并使用send() recv()传输数据
- WTSEnumerateProcesses与套接字和数据结构
- 在 1 个服务器 n 客户端套接字 C++ MFC 应用程序中更新数据的客户端
- C++ TCP 套接字通信 - 连接按预期工作,几秒钟后失败,没有收到新数据,read() 和 recv() 块
- 我们可以在套接字编程中将自定义数据作为辅助数据发送吗?
- TCP 服务器的异步读取使用 boost::asio 打印客户端套接字发送的数据
- 尝试将数据从C++发送到 Python 并使用套接字C++反转,C++ sendto() 和 python recvfr
- 不要从输入队列套接字读取数据
- 通过套接字 c++ 发送长度和数据
- 如何读取套接字编程(c ++)中的所有数据?
- 使用 Broadcast 发出的从节点服务器发送的数据不能被 C++ 套接字 IO 客户端读取
- 无法通过套接字发送或接收数据
- 连接UDP套接字,但仍然接收来自其他源的数据报
- boost::asio-async_read_some示例代码没有读取套接字中的所有数据
- 使用 epoll 边缘触发器的套接字上的数据过多
- 为什么 sys 套接字 recv 函数不填充数据但返回字节长度?
- 将空数据写入非阻塞套接字会导致epoll_wait挂起
- C++ 套接字 - 发送 - 未收到数据
- 通过套接字发送的自定义数据包
- 提升ASIO TCP,为什么我不能在服务器端只有一个数据套接字可以打开和关闭