#include"fileOperation.h" long g_fileSize; //保存文件大小,全局变量初始化为空 //long g_fileSize = 11152; char *g_fileBuf; //保存文件数据 char g_recvBuf[1024]; //保存文件大小 //int main() bool readFile(struct MsgHeader* pmsg) { FILE* read = fopen(pmsg->fileInfo.fileName, "rb"); //文件指针,rb为二进制方式打开 if (!read) //如果读取为空 { perror("文件读取失败\n"); printf("找不到[%s]文件...\n", pmsg->fileInfo.fileName); struct MsgHeader msg = { .msgID = MSG_OPENFILE_FAILD }; return false; } //获取文件大小,单位字节 fseek(read, 0, SEEK_END); //将文件位置指针移动到最后 g_fileSize = ftell(read); //ftell获取当前文件位置指针 fseek(read, 0, SEEK_SET); //移动到开头 printf("filesize:%d\n", g_fileSize); //分配内存 g_fileBuf = calloc(g_fileSize, sizeof(char)); //calloc将内存全部初始化为0 if (!g_fileBuf) { return false; } //将文件读到内存中来 fread(g_fileBuf, sizeof(char), g_fileSize, read); fclose(read); return true; } bool sendFile(SOCKET s, struct MsgHeader* pmsg) { readFile(pmsg); //免去在server当中再读文件!! //把文件名称和大小发给客户端 struct MsgHeader msg = { .msgID = MSG_FILESIZE,.fileInfo.fileSize = g_fileSize }; //fileName = C:\Users\Katherine\Desktop\TyporaHotKey.ahk char tfname[200] = { 0 }, text[100]; //tfname文件名TyporaHotKey;text后缀名.ahk _splitpath(pmsg->fileInfo.fileName, NULL, NULL, tfname, text); //分割路径 strcat(tfname, text); //拼接为TyporaHotKey.ahk,放入tfname strcpy(msg.fileInfo.fileName, tfname); //拷贝到msg.fileInfo.fileName //int ret1 = send(s, //发名称 int ret2 = send(s, (char*)&msg, sizeof(struct MsgHeader), 0); //发大小 //发送文件,【g_fileBuf】要改吗?应该不用 int ret = send(s, g_fileBuf, msg.fileInfo.fileSize,0); //实际发送的文件大小ret if (ret == SOCKET_ERROR) { err("sendFile"); return false; } printf("发送成功(%d)Byte\n", ret); return true; } void downloadFileName(SOCKET serfd) { char fileName[1024] = "你好,我是隔壁的泰山~"; gets_s(fileName, 1023); //获取要下载的文件 struct MsgHeader file = { .msgID = MSG_FILENAME }; strcpy(file.fileInfo.fileName, fileName); send(serfd, (char*)&file, sizeof(struct MsgHeader), 0); } bool recvFile(SOCKET s) { //接收文件大小 recv(s, g_recvBuf, 1023, 0); struct MsgHeader* msg = (struct MsgHeader*)g_recvBuf; printf("接收的文件大小为:(%d)Byte\n", msg->fileInfo.fileSize); //strcpy(msg->fileInfo.fileName, pmsg->fileInfo.fileName); //接收文件时需要分配内存!! if (g_fileBuf == NULL) { g_fileBuf = calloc(msg->fileInfo.fileSize, sizeof(char)); if (!g_fileBuf) { return false; } } int ret = recv(s, g_fileBuf, msg->fileInfo.fileSize, 0); //int ret = recv(s, g_fileBuf, 1023, 0); if (ret == 0) { printf("服务器正常下线...\n"); } else if (ret < 0) { err("recv"); } saveFile(msg); return true; } bool saveFile(struct MsgHeader* pmsg) { FILE* write = fopen(&(pmsg->fileInfo.fileName), "wb"); //文件指针,wb只允许写数据 if (!write) //如果读取为空 { perror("文件读取失败\n"); return false; } fwrite(g_fileBuf, sizeof(char), pmsg->fileInfo.fileSize, write); fclose(write); return true; }