c++ 代码实现ftp
时间: 2023-08-03 15:10:29 浏览: 101
FTP(File Transfer Protocol)是一种用于在网络上进行文件传输的协议,以下是一个使用C++实现FTP的代码示例:
```c++
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <cstring>
#include <cstdlib>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <netdb.h>
using namespace std;
#define BUF_SIZE 1024
int main(int argc, char *argv[]) {
if (argc != 4) {
cerr << "Usage: " << argv[0] << " <server_address> <server_port> <filename>" << endl;
exit(EXIT_FAILURE);
}
// 解析服务器地址和端口号
char *server_address = argv[1];
int server_port = atoi(argv[2]);
// 创建套接字
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd == -1) {
cerr << "Error: create socket" << endl;
exit(EXIT_FAILURE);
}
// 获取服务器IP地址
struct hostent *host = gethostbyname(server_address);
if (host == NULL) {
cerr << "Error: gethostbyname" << endl;
exit(EXIT_FAILURE);
}
char *server_ip = inet_ntoa(*(struct in_addr *)host->h_addr_list[0]);
// 连接服务器
struct sockaddr_in server_addr;
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = inet_addr(server_ip);
server_addr.sin_port = htons(server_port);
if (connect(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) {
cerr << "Error: connect" << endl;
exit(EXIT_FAILURE);
}
// 发送文件名
char *filename = argv[3];
if (send(sockfd, filename, strlen(filename), 0) == -1) {
cerr << "Error: send" << endl;
exit(EXIT_FAILURE);
}
// 接收文件内容
char buf[BUF_SIZE];
int num_bytes;
stringstream ss;
while ((num_bytes = recv(sockfd, buf, BUF_SIZE, 0)) > 0) {
ss.write(buf, num_bytes);
}
if (num_bytes == -1) {
cerr << "Error: recv" << endl;
exit(EXIT_FAILURE);
}
// 将文件内容写入本地文件
string file_content = ss.str();
ofstream outfile(filename, ios::binary);
if (outfile.fail()) {
cerr << "Error: create file" << endl;
exit(EXIT_FAILURE);
}
outfile.write(file_content.c_str(), file_content.length());
outfile.close();
// 关闭套接字
close(sockfd);
cout << "File received successfully." << endl;
return 0;
}
```
以上代码实现了从服务器下载文件的功能,具体实现过程如下:
1. 解析命令行参数,获取服务器地址、端口号和文件名。
2. 创建套接字,获取服务器IP地址,并连接服务器。
3. 发送文件名到服务器。
4. 接收服务器返回的文件内容,并将其保存在一个字符串中。
5. 将字符串中的文件内容写入本地文件。
6. 关闭套接字,输出结果。
该代码使用C++标准库中的fstream和sstream实现了文件读写和字符串操作,使用C语言的socket API实现了网络通信。在编译该代码时,需要链接socket库,命令如下:
```
g++ ftp.cpp -o ftp -lpthread
```
阅读全文