用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 15:03:02 浏览: 72
非常抱歉,刚才回答您问题时,由于系统问题,我的回答漏掉了一些关键信息。以下是完整的代码示例:
```
#include <stdio.h>
#include <stdlib.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"
void send_file(int fd, char *filename) {
char buff[1024];
int res, file_fd;
// 打开要发送的文件
file_fd = open(filename, O_RDONLY);
if (file_fd == -1) {
printf("Open file %s failed!\n", filename);
return;
}
// 循环读取文件内容并发送
while ((res = read(file_fd, buff, sizeof(buff))) > 0) {
send(fd, buff, res, 0);
}
// 关闭文件
close(file_fd);
}
int main() {
int client_fd;
struct sockaddr_in server_addr;
// 创建套接字
client_fd = socket(AF_INET, SOCK_STREAM, 0);
if (client_fd == -1) {
printf("Create socket failed!\n");
return -1;
}
// 设置服务器地址
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(SERVER_PORT);
server_addr.sin_addr.s_addr = inet_addr(SERVER_IP);
// 连接服务器
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);
send_file(client_fd, filename);
// 关闭套接字
close(client_fd);
return 0;
}
```
这个示例代码实现了客户端向服务器发送文件的功能。在main函数中,首先创建了一个套接字client_fd,并设置了服务器的地址server_addr。然后通过connect函数连接服务器,并获取用户输入的文件名后,调用send_file函数将文件发送给服务器。最后关闭套接字并退出程序。
send_file函数的实现和之前的回答一样,主要就是循环读取文件内容并发送。如果打开文件失败,则直接返回。在发送文件过程中,如果read函数返回的字节数小于等于0,则表示文件已经读取完毕,跳出循环。最后关闭文件。
注意,这个示例代码中没有对发送文件的结果进行处理,如果需要进一步的错误处理和状态检查,需要根据具体的需求进行修改。另外,为了简化代码,这里没有进行任何的文件校验和加密等操作,如果需要进行文件完整性校验和传输安全保护,需要根据实际情况进行修改。
希望这个完整的代码示例能够对您有所帮助!
阅读全文