望远镜系统监控+软件升级
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 
 

122 строки
3.0 KiB

  1. #include"fileOperation.h"
  2. long g_fileSize; //保存文件大小,全局变量初始化为空
  3. //long g_fileSize = 11152;
  4. char *g_fileBuf; //保存文件数据
  5. char g_recvBuf[1024]; //保存文件大小
  6. //int main()
  7. bool readFile(struct MsgHeader* pmsg)
  8. {
  9. FILE* read = fopen(pmsg->fileInfo.fileName, "rb"); //文件指针,rb为二进制方式打开
  10. if (!read) //如果读取为空
  11. {
  12. perror("文件读取失败\n");
  13. printf("找不到[%s]文件...\n", pmsg->fileInfo.fileName);
  14. struct MsgHeader msg = { .msgID = MSG_OPENFILE_FAILD };
  15. return false;
  16. }
  17. //获取文件大小,单位字节
  18. fseek(read, 0, SEEK_END); //将文件位置指针移动到最后
  19. g_fileSize = ftell(read); //ftell获取当前文件位置指针
  20. fseek(read, 0, SEEK_SET); //移动到开头
  21. printf("filesize:%d\n", g_fileSize);
  22. //分配内存
  23. g_fileBuf = calloc(g_fileSize, sizeof(char)); //calloc将内存全部初始化为0
  24. if (!g_fileBuf)
  25. {
  26. return false;
  27. }
  28. //将文件读到内存中来
  29. fread(g_fileBuf, sizeof(char), g_fileSize, read);
  30. fclose(read);
  31. return true;
  32. }
  33. bool sendFile(SOCKET s, struct MsgHeader* pmsg)
  34. {
  35. readFile(pmsg); //免去在server当中再读文件!!
  36. //把文件名称和大小发给客户端
  37. struct MsgHeader msg = { .msgID = MSG_FILESIZE,.fileInfo.fileSize = g_fileSize };
  38. //fileName = C:\Users\Katherine\Desktop\TyporaHotKey.ahk
  39. char tfname[200] = { 0 }, text[100]; //tfname文件名TyporaHotKey;text后缀名.ahk
  40. _splitpath(pmsg->fileInfo.fileName, NULL, NULL, tfname, text); //分割路径
  41. strcat(tfname, text); //拼接为TyporaHotKey.ahk,放入tfname
  42. strcpy(msg.fileInfo.fileName, tfname); //拷贝到msg.fileInfo.fileName
  43. //int ret1 = send(s, //发名称
  44. int ret2 = send(s, (char*)&msg, sizeof(struct MsgHeader), 0); //发大小
  45. //发送文件,【g_fileBuf】要改吗?应该不用
  46. int ret = send(s, g_fileBuf, msg.fileInfo.fileSize,0); //实际发送的文件大小ret
  47. if (ret == SOCKET_ERROR)
  48. {
  49. err("sendFile");
  50. return false;
  51. }
  52. printf("发送成功(%d)Byte\n", ret);
  53. return true;
  54. }
  55. void downloadFileName(SOCKET serfd)
  56. {
  57. char fileName[1024] = "你好,我是隔壁的泰山~";
  58. gets_s(fileName, 1023); //获取要下载的文件
  59. struct MsgHeader file = { .msgID = MSG_FILENAME };
  60. strcpy(file.fileInfo.fileName, fileName);
  61. send(serfd, (char*)&file, sizeof(struct MsgHeader), 0);
  62. }
  63. bool recvFile(SOCKET s)
  64. {
  65. //接收文件大小
  66. recv(s, g_recvBuf, 1023, 0);
  67. struct MsgHeader* msg = (struct MsgHeader*)g_recvBuf;
  68. printf("接收的文件大小为:(%d)Byte\n", msg->fileInfo.fileSize);
  69. //strcpy(msg->fileInfo.fileName, pmsg->fileInfo.fileName);
  70. //接收文件时需要分配内存!!
  71. if (g_fileBuf == NULL)
  72. {
  73. g_fileBuf = calloc(msg->fileInfo.fileSize, sizeof(char));
  74. if (!g_fileBuf)
  75. {
  76. return false;
  77. }
  78. }
  79. int ret = recv(s, g_fileBuf, msg->fileInfo.fileSize, 0);
  80. //int ret = recv(s, g_fileBuf, 1023, 0);
  81. if (ret == 0)
  82. {
  83. printf("服务器正常下线...\n");
  84. }
  85. else if (ret < 0)
  86. {
  87. err("recv");
  88. }
  89. saveFile(msg);
  90. return true;
  91. }
  92. bool saveFile(struct MsgHeader* pmsg)
  93. {
  94. FILE* write = fopen(&(pmsg->fileInfo.fileName), "wb"); //文件指针,wb只允许写数据
  95. if (!write) //如果读取为空
  96. {
  97. perror("文件读取失败\n");
  98. return false;
  99. }
  100. fwrite(g_fileBuf, sizeof(char), pmsg->fileInfo.fileSize, write);
  101. fclose(write);
  102. return true;
  103. }