实现过程第一篇已经写过了,这里就是具体的代码实现过程。
单发文本信息对话窗口:
选择文件对话窗口:
接收文件:
SecWin.h:
#pragma once
#include "afxwin.h"
#include "afxcmn.h"
#include <WinSock2.h>
#include <stdio.h>
#include <iostream>
using namespace std;
#pragma comment(lib, "ws2_32.lib")
#define UDP_PORT 12895
#define TCP_PORT 12811
#define WM_UPDATE_STATIC (WM_USER + 100)
#define BUFFER_SIZE 8192
#define FILE_NAME_MAX_SIZE 512
// SecWin 对话框
class SecWin : public CDialog
{
DECLARE_DYNAMIC(SecWin)
public:
SecWin(CWnd* pParent = NULL); // 标准构造函数
virtual ~SecWin();
// 对话框数据
#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_CHATTING_DIALOG };
#endif
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
virtual BOOL OnInitDialog();
DECLARE_MESSAGE_MAP()
public:
CListBox infList; // 显示聊天记录的List Box
// 接收普通udp信息的线程
CWinThread * m_pThread;
// 接收tcp文件信息的线程
CWinThread * recvFileThread;
// 发送tcp文件信息的线程
CWinThread * sendFileThread;
static UINT ThreadFunction(LPVOID pParam);
static UINT RecvFileThread(LPVOID pParam);
static UINT SendFileThread(LPVOID pParam);
afx_msg LRESULT OnUpdateStatic(WPARAM wParam, LPARAM lParam);
afx_msg void OnBnClickedSendMsg();
std::string client_name; // 进行对话的主机名
std::string client_ip; // 进行对话的主机IP
CStatic friend_name;
CFont cfont;// 自定义的字体
afx_msg void OnClose();
CButton btn_recvFile;
CButton btn_rejectFile;
afx_msg void OnBnClickedReceiveFile();
afx_msg void OnBnClickedRejectFile();
afx_msg void OnBnClickedSendFile();
void SendIPAndFileName(CString inf);
};
SecwWin.cpp:
子线程不能更新主线程控件,只能发送一个消息主线程,然后主线程再更新界面控件
// SecWin.cpp : 实现文件
//
#include "stdafx.h"
#include "FeiGe.h"
#include "FeiGeDlg.h"
#include "SecWin.h"
#include "afxdialogex.h"
#include <vector>
#include "string"
#include <tchar.h>
// 发送文件的主机ip
static CString host_ip ;
// 发送的文件名
static CString send_file_name ;
// 接收的文件名
static CString recv_file_name;
// SecWin 对话框
IMPLEMENT_DYNAMIC(SecWin, CDialog)
SecWin::SecWin(CWnd* pParent /*=NULL*/)
: CDialog(IDD_CHATTING_DIALOG, pParent)
{
}
SecWin::~SecWin()
{
}
void SecWin::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_HISTORY, infList);
DDX_Control(pDX, IDC_FRIEND_NAME, friend_name);
DDX_Control(pDX, IDC_RECEIVE_FILE, btn_recvFile);
DDX_Control(pDX, IDC_REJECT_FILE, btn_rejectFile);
}
BEGIN_MESSAGE_MAP(SecWin, CDialog)
ON_BN_CLICKED(IDC_SEND_MSG, &SecWin::OnBnClickedSendMs