用C语言写 三、客户端发送文件 1.char* fgets(name, sizeof(name), stdin);获取文件名 2.open(name,O_RDONLY);打开文件 3.read(fd,buff,sizeof(buff));循环读取文件 4.send_message(fd,buff,res);发送文件给服务器
时间: 2024-01-18 16:03:02 浏览: 70
C语言最简单易懂的读写文件.doc
好的,以下是使用C语言编写客户端发送文件的完整代码:
```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define SERVER_PORT 8888
#define SERVER_IP "127.0.0.1"
int send_file(int fd, const char* filename) {
char buff[1024];
int file_fd = open(filename, O_RDONLY);
if (file_fd == -1) {
printf("Open file %s failed!\n", filename);
return -1;
}
int read_size;
while ((read_size = read(file_fd, buff, sizeof(buff))) > 0) {
int send_size = send(fd, buff, read_size, 0);
if (send_size == -1) {
printf("Send file %s failed!\n", filename);
close(file_fd);
return -1;
}
}
close(file_fd);
return 0;
}
int main() {
// 创建套接字
int client_fd = socket(AF_INET, SOCK_STREAM, 0);
if (client_fd == -1) {
printf("Create socket failed!\n");
return -1;
}
// 设置服务器地址
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(client_fd, (struct sockaddr*)&server_addr, sizeof(server_addr)) == -1) {
printf("Connect to server %s:%d failed!\n", SERVER_IP, SERVER_PORT);
close(client_fd);
return -1;
}
// 获取文件名并发送文件
char filename[100];
printf("Please input the file name: ");
fgets(filename, sizeof(filename), stdin);
filename[strcspn(filename, "\n")] = 0; // 去掉文件名末尾的换行符
if (send_file(client_fd, filename) == -1) {
close(client_fd);
return -1;
}
// 关闭套接字
close(client_fd);
return 0;
}
```
这个代码示例中,我们首先创建了一个套接字client_fd,并设置了服务器的地址server_addr。然后通过connect函数连接服务器,并获取用户输入的文件名后,调用send_file函数将文件发送给服务器。最后关闭套接字并退出程序。
send_file函数的实现和之前的回答一样,主要就是循环读取文件内容并发送。如果打开文件失败,则直接返回。在发送文件过程中,如果send函数返回的字节数小于0,则表示发送失败,直接返回。最后关闭文件。
注意,为了防止fgets函数获取到的文件名末尾包含换行符,我们使用了strcspn函数将其去掉。如果文件名中含有空格等特殊字符,还可以使用trim函数对其进行进一步处理。
希望这个代码示例能够对您有所帮助!
阅读全文