在 Linux 系统中使用 C/C++ 进行套接字编程,可以使用 TCP 或 UDP 协议来发送和接收文件。下面我将通过一个简单的例子来说明如何使用 TCP 协议(因为其提供了面向连接的稳定数据传输)进行文件传送。
1. 服务器端程序
服务器端的基本任务是监听一个端口,接受客户端的连接,然后读取客户端发送的文件数据,并将其写入本地存储。下面是一个简单的服务器端示例代码:
c#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <netinet/in.h> #include <sys/socket.h> #include <sys/types.h> #define PORT 8080 #define BUFFER_SIZE 1024 int main() { int server_fd, new_socket; struct sockaddr_in address; int addrlen = sizeof(address); char buffer[BUFFER_SIZE] = {0}; char *filename = "received_file.txt"; // 创建 socket 文件描述符 if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) { perror("socket failed"); exit(EXIT_FAILURE); } // 绑定 socket 到 localhost 的 8080 端口 address.sin_family = AF_INET; address.sin_addr.s_addr = INADDR_ANY; address.sin_port = htons(PORT); if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) { perror("bind failed"); exit(EXIT_FAILURE); } // 监听这个端口 if (listen(server_fd, 3) < 0) { perror("listen"); exit(EXIT_FAILURE); } // 接受一个传入的连接 if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) { perror("accept"); exit(EXIT_FAILURE); } // 读取数据并写入文件 FILE *file = fopen(filename, "wb"); int bytes_read; while ((bytes_read = read(new_socket, buffer, BUFFER_SIZE)) > 0) { fwrite(buffer, 1, bytes_read, file); } fclose(file); close(new_socket); close(server_fd); return 0; }
2. 客户端程序
客户端的任务是连接到服务器,读取本地文件数据,并将数据发送到服务器。下面是对应的客户端示例代码:
c#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <netinet/in.h> #include <sys/socket.h> #include <sys/types.h> #define PORT 8080 #define BUFFER_SIZE 1024 int main() { int sock = 0; struct sockaddr_in serv_addr; char *filename = "file_to_send.txt"; char buffer[BUFFER_SIZE] = {0}; // 创建 socket 文件描述符 if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) { printf("\n Socket creation error \n"); return -1; } serv_addr.sin_family = AF_INET; serv_addr.sin_port = htons(PORT); // 将 IPv4 地址从文本转换为二进制形式 if(inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr) <= 0) { printf("\nInvalid address/ Address not supported \n"); return -1; } // 连接到服务器 if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) { printf("\nConnection Failed \n"); return -1; } // 读取并发送文件内容 FILE *file = fopen(filename, "rb"); int bytes_read; while ((bytes_read = fread(buffer, 1, BUFFER_SIZE, file)) > 0) { write(sock, buffer, bytes_read); } fclose(file); close(sock); return 0; }
解释
- 服务器端 使用
socket()
,bind()
,listen()
, 和accept()
函数来设置 TCP 服务器,接受客户端的连接。 - 客户端 使用
socket()
和connect()
函数创建一个到服务器的连接。 - 文件数据以二进制形式通过套接字传输。
- 使用
read()
和write()
函数在套接字和文件之间传输数据。
这只是一个基本示例,实际应用中可能需要处理错误、增加安全性或改进性能。