C++利用SOCKET传送文件


 /*server.h*/

  #pragma comment(lib, "WS2_32")

  #include <WinSock2.h>

  #include <iostream>

  //#include <stdio.h>

  #include <assert.h>

  #ifndef COMMONDEF_H

  #define COMMONDEF_H

  #define MAX_PACKET_SIZE   10240    // 数据包的最大长度,单位是sizeof(char)

  #define MAXFILEDIRLENGTH 256     // 存放文件路径的最大长度

  #define PORT     4096    // 端口号

  #define SERVER_IP    "127.0.0.1" // server端的IP地址

  // 各种消息的宏定义

  #define INVALID_MSG      -1   // 无效的消息标识

  #define MSG_FILENAME     1   // 文件的名称

  #define MSG_FILELENGTH     2   // 传送文件的长度

  #define MSG_CLIENT_READY    3   // 客户端准备接收文件

  #define MSG_FILE      4   // 传送文件

  #define MSG_SENDFILESUCCESS    5   // 传送文件成功

  #define MSG_OPENFILE_ERROR    10   // 打开文件失败,可能是文件路径错误找不到文件等原因

  #define MSG_FILEALREADYEXIT_ERROR 11   // 要保存的文件已经存在了

  class CCSDef

  {

  public:

  #pragma pack(1)      // 使结构体的数据按照1字节来对齐,省空间

  // 消息头

  struct TMSG_HEADER

  {

  char    cMsgID;    // 消息标识

  TMSG_HEADER(char MsgID = INVALID_MSG)

  : cMsgID(MsgID)

  {

  }

  };

  // 请求传送的文件名

  // 客户端传给服务器端的是全路径名称

  // 服务器传回给客户端的是文件名

  struct TMSG_FILENAME : public TMSG_HEADER

  {

  char szFileName[256];   // 保存文件名的字符数组

  TMSG_FILENAME()

  : TMSG_HEADER(MSG_FILENAME)

  {

  }

  };

  // 传送文件长度

  struct TMSG_FILELENGTH : public TMSG_HEADER

  {

  long lLength;

  TMSG_FILELENGTH(long length)

  : TMSG_HEADER(MSG_FILELENGTH), lLength(length)

  {

  }

  };

  // Client端已经准备好了,要求Server端开始传送文件

  struct TMSG_CLIENT_READY : public TMSG_HEADER

  {

  TMSG_CLIENT_READY()

  : TMSG_HEADER(MSG_CLIENT_READY)

  {

  }

  };

  // 传送文件

  struct TMSG_FILE : public TMSG_HEADER

  {

  union     // 采用union保证了数据包的大小不大于MAX_PACKET_SIZE * sizeof(char)

  {

  char szBuff[MAX_PACKET_SIZE];

  struct

  {

  int nStart;

  int nSize;

  char szBuff[MAX_PACKET_SIZE - 2 * sizeof(int)];

  }tFile;

  };

  TMSG_FILE()

  : TMSG_HEADER(MSG_FILE)

  {

  }

  };

  // 传送文件成功

  struct TMSG_SENDFILESUCCESS : public TMSG_HEADER

  {

  TMSG_SENDFILESUCCESS()

  : TMSG_HEADER(MSG_SENDFILESUCCESS)

  {

  }

  };

  // 传送出错信息,包括:

  // MSG_OPENFILE_ERROR:打开文件失败

  // MSG_FILEALREADYEXIT_ERROR:要保存的文件已经存在了

  struct TMSG_ERROR_MSG : public TMSG_HEADER

  {

  TMSG_ERROR_MSG(char cErrorMsg)

  : TMSG_HEADER(cErrorMsg)

  {

  }

  };

  #pragma pack()

  };

  #endif

  /*server.cpp*/

  #include "server.h"

  char g_szNewFileName[MAXFILEDIRLENGTH];

  char g_szBuff[MAX_PACKET_SIZE + 1];

  long g_lLength;

  char* g_pBuff = NULL;

  // 初始化socket库

  bool InitSocket();

  // 关闭socket库

  bool CloseSocket();

  // 解析消息进行相应的处理

  bool ProcessMsg(SOCKET sClient);

  // 监听Client的消息

  void ListenToClient();

  // 打开文件

  bool OpenFile(CCSDef::TMSG_HEADER* pMsgHeader, SOCKET sClient);

  // 传送文件

  bool SendFile(SOCKET sClient);

  // 读取文件进入缓冲区

  bool ReadFile(SOCKET sClient);

  • 1
  • 2
  • 3
  • 4
  • 下一页

相关内容