1、创建套接字:使用socket()
函数创建一个TCP套接字,在Linux系统中,可以这样写代码:
int sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd < 0) { perror("socket creation failed"); exit(EXIT_FAILURE); }
2、设置服务器地址和端口:使用struct sockaddr_in
结构体来指定服务器的IP地址和端口号。
struct sockaddr_in server_addr; memset(&server_addr, 0, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(8080); // 这里假设服务器端口号为8080 inet_pton(AF_INET, "127.0.0.1", &server_addr.sin_addr); // 这里假设服务器IP地址为本机地址
3、连接服务器:使用connect()
函数将套接字连接到服务器。
if (connect(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) { perror("Connection Failed"); exit(EXIT_FAILURE); }
4、打开文件:使用fopen()
函数打开要上传的文件。
FILE *file = fopen("example.txt", "rb"); if (file == NULL) { perror("File not opened"); exit(EXIT_FAILURE); }
5、读取文件内容并发送:使用fread()
函数从文件中读取数据到缓冲区,然后使用send()
函数将缓冲区的内容发送给服务器。
char buffer[1024]; int bytesRead; while ((bytesRead = fread(buffer, 1, sizeof(buffer), file)) > 0) { send(sockfd, buffer, bytesRead, 0); }
6、关闭文件和套接字:文件发送完毕后,关闭文件和套接字。
fclose(file); close(sockfd);
二、使用FTP协议上传文件(以libcurl库为例)
1、安装libcurl库:在使用libcurl之前,需要先安装该库,在Ubuntu系统中,可以使用以下命令安装:
sudo apt-get install libcurl4-openssl-dev
2、编写代码:使用libcurl库提供的函数来上传文件,以下是一个简单的示例代码:
#include <stdio.h> #include <curl/curl.h> int main(void) { CURL *curl; FILE *hd_src; struct stat file_info; struct curl_slist *headerlist = NULL; long file_size; char *url = "ftp://username:password@ftp.server.com/path/to/destination/file.txt"; char *upload_filename = "local_file.txt"; // 获取文件大小 stat(upload_filename, &file_info); file_size = file_info.st_size; // 初始化libcurl curl_global_init(CURL_GLOBAL_ALL); curl = curl_easy_init(); if (curl) { // 设置FTP URL curl_easy_setopt(curl, CURLOPT_URL, url); // 设置上传文件名 curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L); // 设置读取文件的回调函数 curl_easy_setopt(curl, CURLOPT_READFUNCTION, NULL); // 设置读取数据的缓冲区大小 curl_easy_setopt(curl, CURLOPT_READDATA, NULL); // 设置上传进度条功能(可选) curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 0L); // 设置上传文件名 curl_easy_setopt(curl, CURLOPT_INFILESIZE_LARGE, (curl_off_t)file_size); // 执行文件上传操作 CURLcode res = curl_easy_perform(curl); if (res != CURLE_OK) { fprintf(stderr, "curl_easy_perform() failed: %s ", curl_easy_strerror(res)); } // 清理libcurl资源 curl_easy_cleanup(curl); } curl_global_cleanup(); return 0; }
三、使用SSH协议上传文件(以libssh库为例)
1、安装libssh库:在使用libssh之前,需要先安装该库,在Ubuntu系统中,可以使用以下命令安装:
sudo apt-get install libssh-dev
2、编写代码:使用libssh库提供的函数来上传文件,以下是一个简单的示例代码:
#include <libssh/libssh.h> #include <stdlib.h> #include <stdio.h> #include <string.h> int main() { ssh_session my_ssh_session; int rc; char *password; int port = 22; char *host="hostname"; char *user="username"; // 初始化libssh会话 my_ssh_session = ssh_new(); if (my_ssh_session == NULL) return -1; // No memory allocated for session. ssh_options_set(my_ssh_session, SSH_OPTIONS_HOST, host); ssh_options_set(my_ssh_session, SSH_OPTIONS_USER, user); ssh_options_set(my_ssh_session, SSH_OPTIONS_PORT, &port); // 连接到服务器 rc = ssh_connect(my_ssh_session); if (rc != SSH_OK) { fprintf(stderr, "Error connecting to localhost: %s ", ssh_get_error(my_ssh_session)); ssh_free(my_ssh_session); return -1; } // 验证服务器指纹 rc = ssh_is_server_known(my_ssh_session); if (rc == SSH_SERVER_KNOWN_OK) { printf("Server '%s' is already known and trusted. ", host); } else { printf("Adding new host key for server '%s' [%s]... ", host, ssh_get_hexa(my_ssh_session, ssh_get_server_publickey_blob(my_ssh_session, NULL), NULL)); if (ssh_write_knownhost(my_ssh_session) < 0) { fprintf(stderr, "Error writing known host data "); ssh_disconnect(my_ssh_session); ssh_free(my_ssh_session); return -1; } } // 进行密码认证 password = getpass("Enter your password: "); rc = ssh_userauth_password(my_ssh_session, NULL, password); if (rc != SSH_AUTH_SUCCESS) { fprintf(stderr, "Authentication failed "); ssh_disconnect(my_ssh_session); ssh_free(my_ssh_session); return -1; } // 执行SCP命令上传文件(这里假设已经将SCP命令添加到了服务器的PATH中) ssh_channel channel; channel = ssh_channel_new(my_ssh_session); if (channel == NULL) return -1; if (ssh_channel_open_session(channel) != SSH_OK) { ssh_channel_free(channel); return -1; } if (ssh_channel_request_exec(channel, "scp /local/path/to/file user@remote:/remote/path/to/file") != SSH_OK) { ssh_channel_close(channel); ssh_channel_free(channel); return -1; } ssh_channel_close(channel); ssh_channel_free(channel); // 断开连接并释放资源 ssh_disconnect(my_ssh_session); ssh_free(my_ssh_session); return 0; }