用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);发送文件给服务器
时间: 2023-11-26 16:05:09 浏览: 190
使用c语言实现文件传输
下面是一个简单的示例代码,可以发送指定文件到服务器。
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define BUF_SIZE 1024
int main(int argc, char *argv[]) {
int sock;
struct sockaddr_in serv_addr;
char filename[256];
char buf[BUF_SIZE];
int file_size, nread, nsend, total_send = 0;
int fd;
if (argc != 3) {
printf("Usage: %s <server_ip> <port>\n", argv[0]);
exit(1);
}
// 创建套接字
sock = socket(PF_INET, SOCK_STREAM, 0);
if (sock == -1) {
perror("socket");
exit(1);
}
// 初始化服务器地址结构体
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = inet_addr(argv[1]);
serv_addr.sin_port = htons(atoi(argv[2]));
// 连接服务器
if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) == -1) {
perror("connect");
exit(1);
}
// 获取要发送的文件名
printf("Enter filename: ");
fgets(filename, sizeof(filename), stdin);
filename[strlen(filename) - 1] = '\0'; // 去除换行符
// 打开文件
fd = open(filename, O_RDONLY);
if (fd == -1) {
perror("open");
exit(1);
}
// 获取文件大小
file_size = lseek(fd, 0, SEEK_END);
lseek(fd, 0, SEEK_SET);
// 发送文件名和文件大小
sprintf(buf, "%s %d", filename, file_size);
if (send(sock, buf, strlen(buf), 0) == -1) {
perror("send");
exit(1);
}
// 循环读取文件并发送
while ((nread = read(fd, buf, BUF_SIZE)) > 0) {
nsend = send(sock, buf, nread, 0);
if (nsend == -1) {
perror("send");
exit(1);
}
total_send += nsend;
}
if (nread == -1) {
perror("read");
exit(1);
}
printf("Sent %d bytes.\n", total_send);
// 关闭套接字和文件
close(fd);
close(sock);
return 0;
}
```
注意事项:
1. 在发送文件之前,需要先向服务器发送文件名和文件大小,以便服务器知道接收的文件信息。
2. 在读取文件时,需要使用循环读取,直到文件全部读取完毕。
3. 在发送文件时,需要使用循环发送,直到文件全部发送完毕。记得记录已经发送的字节数,以便统计发送的文件大小。
阅读全文