FTP服务器文件传输
FTP server file transfer
我不确定关于ftp文件传输的一些事情。我正在写一个ftp服务器,我正试图弄清楚如何使文件传输正确工作。到目前为止,它在某种程度上是有效的,但我有一些疑问。以下是我的文件传输函数(目前只检索到):
void RETRCommand(int & clie_sock, int & c_data_sock, char buffer[]){
ifstream file; //clie_sock is used for commands and c_data_sock for data transfer
char *file_name, packet[PACKET_SIZE]; //packet size is 2040
int packet_len, pre_pos = 0, file_end;
file_name = new char[strlen(buffer + 5)];
strcpy(file_name, buffer + 5);
sprintf(buffer, "150 Opening BINARY mode data connection for file transferrn");
if (send(clie_sock, buffer, strlen(buffer), 0) == -1) {
perror("Error while writing ");
close(clie_sock);
exit(1);
}
cout << "sent: " << buffer << endl;
file_name[strlen(file_name) - 2] = ' ';
file.open(file_name, ios::in | ios::binary);
if (file.is_open()) {
file.seekg(0, file.end);
file_end = (int) file.tellg();
file.seekg(0, file.beg);
while(file.good()){
pre_pos = file.tellg();
file.read(packet, PACKET_SIZE);
if ((int) file.tellg() == -1)
packet_len = file_end - pre_pos;
else
packet_len = PACKET_SIZE;
if (send(c_data_sock, packet, packet_len, 0) == -1) {
perror("Error while writing ");
close(clie_sock);
exit(1);
}
cout << "sent some data" << endl;
}
}
else {
sprintf(buffer, "550 Requested action not taken. File unavailablern", packet);
if (send(clie_sock, buffer, packet_len + 2, 0) == -1) {
perror("Error while writing ");
close(clie_sock);
exit(1);
}
cout << "sent: " << buffer << endl;
delete(file_name);
return;
}
sprintf(buffer, "226 Transfer completern");
if (send(clie_sock, buffer, strlen(buffer), 0) == -1) {
perror("Error while writing ");
close(clie_sock);
exit(1);
}
cout << "sent: " << buffer << endl;
close(c_data_sock);
delete(file_name);
}
所以一个问题是数据传输本身。我不太确定它应该如何工作。现在它是这样工作的:服务器将所有数据发送到c_data_sock,关闭这个套接字,然后客户端开始做一些事情。客户端不应该在服务器发送数据时接收数据吗?另一个问题是劳工命令。我怎么能收到劳工指令?我尝试将标志设置为MSG_OOB,但随后我得到一个错误,说"无效参数"。如果有人能给我一个提示或一个例子,告诉我如何正确地做这件事,我将很高兴,因为我似乎无法自己弄清楚。
谢谢,约翰
Ftp使用两个连接。First - is命令连接,在您的示例中是clie_sock。应该通过它接收到' labor '命令。您将以与接收'RETR'命令相同的方式接收它。为了接收文件,客户端与服务器建立数据连接(c_data_sock套接字)。它将不会被打开,直到客户端连接,所以这是你的第二个问题的答案。服务器执行此函数后,无法启动客户端。第一个客户端发送'retr'命令到命令套接字。然后,您的服务器等待来自客户端的新连接(在发送数据ip和端口之后)。然后客户端连接(现在您已经准备好了c_data_sock)并将所有数据发送到该套接字,这些数据依次由客户端接收。
如果你觉得你不懂的话,你可能需要多读一些关于社交的一般性知识。我更喜欢这个:http://beej.us/guide/bgnet/
也有内存泄漏,在你用
分配数组之后file_name = new char[strlen(buffer + 5)];
你需要使用
删除它delete [] file_name;
否则file_name将被视为一个简单的指针,而不是一个数组,所以大多数数组内存将被应用程序保留,这是不好的,特别是在创建服务器时。
- 如何在标准c ++中流式传输/读取二进制文件的中间部分并写入另一个文件?
- 转换 mp4 文件并将其流式传输到带有树莓派的查看器
- QTCPSocket(Qt-C++)中的音频文件逐字节传输
- 传输文件一次又一次地发送相同的字节
- C++文件传输的校验和算法
- 如何在Ubuntu中将内容从一个文件传输到另一个文件
- 如何在 mfc c++ 中流式传输.zip文件夹的二进制表示形式
- 在计算机之间使用C 传输文件
- 使用 MQTT 进行文件传输
- 如何将数据类型声明从.cpp文件传输到 .cu 文件
- 通过TCP在客户端/ C#服务器之间传输文件C++
- 如何将字符串形式的值从类文件传输到输出文件
- 通过USB将文件从iOS设备传输到Windows PC
- TCP/IP文件传输C
- 为什么文件没有通过 tcp 在 C# 中的客户端和 C 中的服务器之间正确传输(保存?)
- 如何确保TCP文件传输完成(c++)
- 在web浏览器上流式传输c++文件
- 使用以太网电缆在两台 Mac 之间自动传输文件
- C++Libssh-服务器/客户端通过局域网传输文件的例子
- c++以相反的顺序逐行传输文件