简单的TCP客户端发包工具

2023-05-16

一、TCP介绍

先放这里有时间在写,最近在写DuiLib相关的使用内容,这部分大家凑活着看

二、程序截图

下载链接

链接:https://pan.baidu.com/s/1MzNUzwd7WwBat6vNMcu6Ow 密码:ibuv

 

主要源码:

//.h


// TCPClient.cpp : 定义应用程序的类行为。
//

#include "stdafx.h"
#include "TCPClient.h"
#include "TCPClientDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// CTCPClientApp

BEGIN_MESSAGE_MAP(CTCPClientApp, CWinApp)
	ON_COMMAND(ID_HELP, &CWinApp::OnHelp)
END_MESSAGE_MAP()


// CTCPClientApp 构造

CTCPClientApp::CTCPClientApp()
{
	// 支持重新启动管理器
	m_dwRestartManagerSupportFlags = AFX_RESTART_MANAGER_SUPPORT_RESTART;

	// TODO: 在此处添加构造代码,
	// 将所有重要的初始化放置在 InitInstance 中
}


// 唯一的一个 CTCPClientApp 对象

CTCPClientApp theApp;


// CTCPClientApp 初始化

BOOL CTCPClientApp::InitInstance()
{
	// 如果一个运行在 Windows XP 上的应用程序清单指定要
	// 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,
	//则需要 InitCommonControlsEx()。否则,将无法创建窗口。
	INITCOMMONCONTROLSEX InitCtrls;
	InitCtrls.dwSize = sizeof(InitCtrls);
	// 将它设置为包括所有要在应用程序中使用的
	// 公共控件类。
	InitCtrls.dwICC = ICC_WIN95_CLASSES;
	InitCommonControlsEx(&InitCtrls);

	CWinApp::InitInstance();


	AfxEnableControlContainer();

	// 创建 shell 管理器,以防对话框包含
	// 任何 shell 树视图控件或 shell 列表视图控件。
	CShellManager *pShellManager = new CShellManager;

	// 标准初始化
	// 如果未使用这些功能并希望减小
	// 最终可执行文件的大小,则应移除下列
	// 不需要的特定初始化例程
	// 更改用于存储设置的注册表项
	// TODO: 应适当修改该字符串,
	// 例如修改为公司或组织名
	SetRegistryKey(_T("应用程序向导生成的本地应用程序"));

	CTCPClientDlg dlg;
	m_pMainWnd = &dlg;
	INT_PTR nResponse = dlg.DoModal();
	if (nResponse == IDOK)
	{
		// TODO: 在此放置处理何时用
		//  “确定”来关闭对话框的代码
	}
	else if (nResponse == IDCANCEL)
	{
		// TODO: 在此放置处理何时用
		//  “取消”来关闭对话框的代码
	}

	// 删除上面创建的 shell 管理器。
	if (pShellManager != NULL)
	{
		delete pShellManager;
	}

	// 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,
	//  而不是启动应用程序的消息泵。
	return FALSE;
}

//.cpp


// TCPClientDlg.cpp : 实现文件
//

#include "stdafx.h"
#include "TCPClient.h"
#include "TCPClientDlg.h"
#include "afxdialogex.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif
#define TIMEID 1
CTCPClientDlg* CTCPClientDlg::m_TCPClient;

// 用于应用程序“关于”菜单项的 CAboutDlg 对话框

class CAboutDlg : public CDialogEx
{
public:
	CAboutDlg();

// 对话框数据
	enum { IDD = IDD_ABOUTBOX };

	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持

// 实现
protected:
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
{
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()


// CTCPClientDlg 对话框




CTCPClientDlg::CTCPClientDlg(CWnd* pParent /*=NULL*/)
	: CDialogEx(CTCPClientDlg::IDD, pParent)
	, m_DestIP(0)
	, m_DestPort(0)
	, m_strContent(_T(""))
	, m_Status(_T(""))
	, m_Detail(_T(""))
{
	m_TCPClient = this;
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CTCPClientDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
	DDX_IPAddress(pDX, IDC_IPADDRESS1, m_DestIP);
	DDX_Text(pDX, IDC_EDIT_PORT, m_DestPort);
	DDX_Text(pDX, IDC_EDIT_CONTENT, m_strContent);
	DDX_Control(pDX, IDC_STATIC_BCONNECT, m_Tip);
	DDX_Text(pDX, IDC_STATIC_BCONNECT, m_Status);
	DDX_Text(pDX, IDC_EDIT_RESULT, m_Detail);
	DDX_Control(pDX, IDC_EDIT_RESULT, m_EditResult);
	DDX_Control(pDX, IDC_EDIT_FAIL, m_EditFail);
	DDX_Control(pDX, IDC_COMBO1, m_ComboBox);
}

BEGIN_MESSAGE_MAP(CTCPClientDlg, CDialogEx)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_BUTTON_CON_SEND, &CTCPClientDlg::OnBnClickedButtonConSend)
	ON_BN_CLICKED(IDC_BUTTON_SEND, &CTCPClientDlg::OnBnClickedButtonSend)
	ON_BN_CLICKED(IDC_BUTTON_STOP, &CTCPClientDlg::OnBnClickedButtonStop)
	ON_BN_CLICKED(IDC_BUTTON_RECONNECT, &CTCPClientDlg::OnBnClickedButtonReconnect)
END_MESSAGE_MAP()


// CTCPClientDlg 消息处理程序

BOOL CTCPClientDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	// 将“关于...”菜单项添加到系统菜单中。

	// IDM_ABOUTBOX 必须在系统命令范围内。
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		BOOL bNameValid;
		CString strAboutMenu;
		bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
		ASSERT(bNameValid);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
	//  执行此操作
	SetIcon(m_hIcon, TRUE);			// 设置大图标
	SetIcon(m_hIcon, FALSE);		// 设置小图标

	// TODO: 在此添加额外的初始化代码
	m_ComboBox.SetCurSel(0);
	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

void CTCPClientDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialogEx::OnSysCommand(nID, lParam);
	}
}

// 如果向对话框添加最小化按钮,则需要下面的代码
//  来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
//  这将由框架自动完成。

void CTCPClientDlg::OnPaint()
{
	if (IsIconic())
	{
		CPaintDC dc(this); // 用于绘制的设备上下文

		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

		// 使图标在工作区矩形中居中
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// 绘制图标
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialogEx::OnPaint();
	}
}

//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CTCPClientDlg::OnQueryDragIcon()
{
	return static_cast<HCURSOR>(m_hIcon);
}



void CTCPClientDlg::OnBnClickedButtonConSend()
{
	// TODO: 在此添加控件通知处理程序代码
	// TODO: 在此添加控件通知处理程序代码
	CString strCBText;
	m_EditResult.SetWindowTextA("");
	m_EditFail.SetWindowTextA("");

	UpdateData(TRUE);
	unsigned char *pIP;
	CString strIP;//IP
	CString strPort;//端口号
	//CString strTimes;//发送次数
	CString strContent;//发送内容
	CString strStatus;
	CString strErr;
	//显示时间的变量
	int iHour;
	int iMinute;
	int iSecond;
	pIP = (unsigned   char*)&m_DestIP;
	strIP.Format("%u.%u.%u.%u", *(pIP + 3), *(pIP + 2), *(pIP + 1), *pIP);
	strPort.Format("%u", m_DestPort);
	//strTimes.Format("%u", m_SendTimes);
	strContent.Format("%s", m_strContent);
	strStatus.Format("%s", "连接状态:未连接");
	WSADATA wsaData;
	char buff[1024];
	memset(buff, 0, sizeof(buff));

	if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
	{
		MessageBox("状态:加载Winsock失败", "提示", 0);
		GetDlgItem(IDC_STATIC_BCONNECT)->SetWindowText(strErr);
		//获得系统时间显示发送内容
		CString strContinueTIP;
		CTime tm; tm = CTime::GetCurrentTime();
		iHour = tm.GetHour();
		iMinute = tm.GetMinute();
		iSecond = tm.GetSecond();
		strContinueTIP.Format("%d:%d:%d %s\r\n\r\n", iHour, iMinute, iSecond, strErr);
		m_EditFail.SetSel(-1);
		m_EditFail.ReplaceSel(strContinueTIP);
		strContinueTIP.Empty();
		strErr.Empty();
		return;
	}
	SOCKADDR_IN addrSrv;
	addrSrv.sin_family = AF_INET;
	addrSrv.sin_port = htons(atoi(strPort));
	addrSrv.sin_addr.S_un.S_addr = inet_addr(strIP.GetBuffer());
	//创建套接字  
	m_SocketClient = socket(AF_INET, SOCK_STREAM, 0);
	if (SOCKET_ERROR == m_SocketClient)
	{

		strErr.Format("状态:Socket创建失败:%d", WSAGetLastError());
		GetDlgItem(IDC_STATIC_BCONNECT)->SetWindowText(strErr);
		//获得系统时间显示发送内容
		CString strContinueTIP;
		CTime tm; tm = CTime::GetCurrentTime();
		iHour = tm.GetHour();
		iMinute = tm.GetMinute();
		iSecond = tm.GetSecond();
		strContinueTIP.Format("%d:%d:%d %s\r\n\r\n", iHour, iMinute, iSecond, strErr);
		m_EditFail.SetSel(-1);
		m_EditFail.ReplaceSel(strContinueTIP);
		strContinueTIP.Empty();
		strErr.Empty();
		//MessageBox(strErr, "提示", 0);
		return;
	}
	//向服务器发出连接请求  
	if (connect(m_SocketClient, (struct  sockaddr*)&addrSrv, sizeof(addrSrv)) == INVALID_SOCKET) {
		//printf(”Connect failed : %d”, WSAGetLastError());

		strErr.Format("状态:连接失败:%d", WSAGetLastError());
		GetDlgItem(IDC_STATIC_BCONNECT)->SetWindowText(strErr);
		//获得系统时间显示发送内容
		CString strContinueTIP;
		CTime tm; tm = CTime::GetCurrentTime();
		iHour = tm.GetHour();
		iMinute = tm.GetMinute();
		iSecond = tm.GetSecond();
		strContinueTIP.Format("%d:%d:%d %s\r\n\r\n", iHour, iMinute, iSecond, strErr);
		m_EditFail.SetSel(-1);
		m_EditFail.ReplaceSel(strContinueTIP);
		strContinueTIP.Empty();
		strErr.Empty();
		//MessageBox(strErr, "提示", 0);
		return;
	}
	else
	{
		strErr.Format("状态:已连接");
		GetDlgItem(IDC_STATIC_BCONNECT)->SetWindowText(strErr);
	}



	//获得ComboBox内容
	int nIndex = m_ComboBox.GetCurSel();
	m_ComboBox.GetLBText(nIndex, strCBText);
	//设置定时器
	int iTimes = atoi(strCBText.GetString());
	UINT uElapse = 1000 / iTimes;
	//开始定时发送数据  
	SetTimer(TIMEID, uElapse, TimerProc);
	CWnd* cwndBtStop =  GetDlgItem(IDC_BUTTON_STOP);
	cwndBtStop->EnableWindow(TRUE);
	CWnd* cwndBtContinue = GetDlgItem(IDC_BUTTON_CON_SEND);
	cwndBtContinue->EnableWindow(FALSE);
	return;
}


void CTCPClientDlg::OnBnClickedButtonSend()
{
	// TODO: 在此添加控件通知处理程序代码
	m_EditResult.SetWindowTextA("");
	m_EditFail.SetWindowTextA("");
	SendTcpMessage();
}


void CTCPClientDlg::OnBnClickedButtonStop()
{
	// TODO: 在此添加控件通知处理程序代码
	// TODO: 在此添加控件通知处理程序代码
	if (FALSE == KillTimer(TIMEID))
	{
		MessageBox("停止失败", "提示", 0);
	}
	CWnd* cwndBtStop = GetDlgItem(IDC_BUTTON_STOP);
	cwndBtStop->EnableWindow(FALSE);
	CWnd* cwndBtContinue = GetDlgItem(IDC_BUTTON_CON_SEND);
	cwndBtContinue->EnableWindow(TRUE);
	closesocket(m_SocketClient);
	WSACleanup();
}


void CTCPClientDlg::OnBnClickedButtonReconnect()
{
	// TODO: 在此添加控件通知处理程序代码
	// TODO: 在此添加控件通知处理程序代码
	// TODO: 在此添加控件通知处理程序代码
	CString strCBText;

	UpdateData(TRUE);
	unsigned char *pIP;
	CString strIP;//IP
	CString strPort;//端口号
	//CString strTimes;//发送次数
	CString strContent;//发送内容
	CString strStatus;
	CString strErr;
	//显示时间的变量
	int iHour;
	int iMinute;
	int iSecond;
	pIP = (unsigned   char*)&m_DestIP;
	strIP.Format("%u.%u.%u.%u", *(pIP + 3), *(pIP + 2), *(pIP + 1), *pIP);
	strPort.Format("%u", m_DestPort);
	//strTimes.Format("%u", m_SendTimes);
	strContent.Format("%s", m_strContent);
	strStatus.Format("%s", "连接状态:未连接");
	WSADATA wsaData;
	char buff[1024];
	memset(buff, 0, sizeof(buff));

	if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
	{
		MessageBox("状态:加载Winsock失败", "提示", 0);
		GetDlgItem(IDC_STATIC_BCONNECT)->SetWindowText(strErr);
		//获得系统时间显示发送内容
		CString strContinueTIP;
		CTime tm; tm = CTime::GetCurrentTime();
		iHour = tm.GetHour();
		iMinute = tm.GetMinute();
		iSecond = tm.GetSecond();
		strContinueTIP.Format("%d:%d:%d %s\r\n\r\n", iHour, iMinute, iSecond, strErr);
		m_EditFail.SetSel(-1);
		m_EditFail.ReplaceSel(strContinueTIP);
		strContinueTIP.Empty();
		strErr.Empty();
		return;
	}
	SOCKADDR_IN addrSrv;
	addrSrv.sin_family = AF_INET;
	addrSrv.sin_port = htons(atoi(strPort));
	addrSrv.sin_addr.S_un.S_addr = inet_addr(strIP.GetBuffer());
	//创建套接字  
	m_SocketClient = socket(AF_INET, SOCK_STREAM, 0);
	if (SOCKET_ERROR == m_SocketClient)
	{

		strErr.Format("状态:Socket创建失败:%d", WSAGetLastError());
		GetDlgItem(IDC_STATIC_BCONNECT)->SetWindowText(strErr);
		//获得系统时间显示发送内容
		CString strContinueTIP;
		CTime tm; tm = CTime::GetCurrentTime();
		iHour = tm.GetHour();
		iMinute = tm.GetMinute();
		iSecond = tm.GetSecond();
		strContinueTIP.Format("%d:%d:%d %s\r\n\r\n", iHour, iMinute, iSecond, strErr);
		m_EditFail.SetSel(-1);
		m_EditFail.ReplaceSel(strContinueTIP);
		strContinueTIP.Empty();
		strErr.Empty();
		//MessageBox(strErr, "提示", 0);
		return;
	}
	//向服务器发出连接请求  
	if (connect(m_SocketClient, (struct  sockaddr*)&addrSrv, sizeof(addrSrv)) == INVALID_SOCKET) {
		//printf(”Connect failed : %d”, WSAGetLastError());

		strErr.Format("状态:连接失败:%d", WSAGetLastError());
		GetDlgItem(IDC_STATIC_BCONNECT)->SetWindowText(strErr);
		//获得系统时间显示发送内容
		CString strContinueTIP;
		CTime tm; tm = CTime::GetCurrentTime();
		iHour = tm.GetHour();
		iMinute = tm.GetMinute();
		iSecond = tm.GetSecond();
		strContinueTIP.Format("%d:%d:%d %s\r\n\r\n", iHour, iMinute, iSecond, strErr);
		m_EditFail.SetSel(-1);
		m_EditFail.ReplaceSel(strContinueTIP);
		strContinueTIP.Empty();
		strErr.Empty();
		//MessageBox(strErr, "提示", 0);
		return;
	}
	else
	{
		strErr.Format("状态:已连接");
		GetDlgItem(IDC_STATIC_BCONNECT)->SetWindowText(strErr);
	}



	//获得ComboBox内容
	int nIndex = m_ComboBox.GetCurSel();
	m_ComboBox.GetLBText(nIndex, strCBText);
	//设置定时器
	int iTimes = atoi(strCBText.GetString());
	UINT uElapse = 1000 / iTimes;
	//开始定时发送数据  
	SetTimer(TIMEID, uElapse, TimerProc);
	CWnd* cwndBtStop = GetDlgItem(IDC_BUTTON_STOP);
	cwndBtStop->EnableWindow(TRUE);
	CWnd* cwndBtContinue = GetDlgItem(IDC_BUTTON_CON_SEND);
	cwndBtContinue->EnableWindow(FALSE);
	CWnd* cwndBtReContinue = m_TCPClient->GetDlgItem(IDC_BUTTON_RECONNECT);
	cwndBtReContinue->EnableWindow(FALSE);
	return;
}
void CTCPClientDlg::SendTcpMessage()
{
	UpdateData(TRUE);
	unsigned char *pIP;
	CString strIP;//IP
	CString strPort;//端口号
	//CString strTimes;//发送次数
	CString strContent;//发送内容
	CString strStatus;
	CString strErr;
	//显示时间的变量
	int iHour;
	int iMinute;
	int iSecond;
	pIP = (unsigned   char*)&m_DestIP;
	strIP.Format("%u.%u.%u.%u", *(pIP + 3), *(pIP + 2), *(pIP + 1), *pIP);
	strPort.Format("%u", m_DestPort);
	//strTimes.Format("%u", m_SendTimes);
	strContent.Format("%s", m_strContent);
	strStatus.Format("%s", "连接状态:未连接");
	WSADATA wsaData;
	char buff[1024];
	memset(buff, 0, sizeof(buff));

	if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
	{
		MessageBox("状态:加载Winsock失败", "提示", 0);
		GetDlgItem(IDC_STATIC_BCONNECT)->SetWindowText(strErr);
		//获得系统时间显示发送内容
		CString strContinueTIP;
		CTime tm; tm = CTime::GetCurrentTime();
		iHour = tm.GetHour();
		iMinute = tm.GetMinute();
		iSecond = tm.GetSecond();
		strContinueTIP.Format("%d:%d:%d %s\r\n\r\n", iHour, iMinute, iSecond, strErr);
		m_EditFail.SetSel(-1);
		m_EditFail.ReplaceSel(strContinueTIP);
		strContinueTIP.Empty();
		strErr.Empty();
		return;
	}
	SOCKADDR_IN addrSrv;
	addrSrv.sin_family = AF_INET;
	addrSrv.sin_port = htons(atoi(strPort));
	addrSrv.sin_addr.S_un.S_addr = inet_addr(strIP.GetBuffer());
	//创建套接字  
	SOCKET sockClient = socket(AF_INET, SOCK_STREAM, 0);
	if (SOCKET_ERROR == sockClient)
	{

		strErr.Format("状态:Socket创建失败:%d", WSAGetLastError());
		GetDlgItem(IDC_STATIC_BCONNECT)->SetWindowText(strErr);
		//获得系统时间显示发送内容
		CString strContinueTIP;
		CTime tm; tm = CTime::GetCurrentTime();
		iHour = tm.GetHour();
		iMinute = tm.GetMinute();
		iSecond = tm.GetSecond();
		strContinueTIP.Format("%d:%d:%d %s\r\n\r\n", iHour, iMinute, iSecond, strErr);
		m_EditFail.SetSel(-1);
		m_EditFail.ReplaceSel(strContinueTIP);
		strContinueTIP.Empty();
		strErr.Empty();
		//MessageBox(strErr, "提示", 0);
		return;
	}
	//向服务器发出连接请求  
	if (connect(sockClient, (struct  sockaddr*)&addrSrv, sizeof(addrSrv)) == INVALID_SOCKET) {
		//printf(”Connect failed : %d”, WSAGetLastError());

		strErr.Format("状态:连接失败:%d", WSAGetLastError());
		GetDlgItem(IDC_STATIC_BCONNECT)->SetWindowText(strErr);
		//获得系统时间显示发送内容
		CString strContinueTIP;
		CTime tm; tm = CTime::GetCurrentTime();
		iHour = tm.GetHour();
		iMinute = tm.GetMinute();
		iSecond = tm.GetSecond();
		strContinueTIP.Format("%d:%d:%d %s\r\n\r\n", iHour, iMinute, iSecond, strErr);
		m_EditFail.SetSel(-1);
		m_EditFail.ReplaceSel(strContinueTIP);
		strContinueTIP.Empty();
		strErr.Empty();
		//MessageBox(strErr, "提示", 0);
		return;
	}
	else
	{
		strErr.Format("状态:已连接");
		GetDlgItem(IDC_STATIC_BCONNECT)->SetWindowText(strErr);
	}

	//发送数据  
	CString strAdd; //将时间+内容追加到控件中  
	if (m_strContent.IsEmpty())
	{
		closesocket(sockClient);
		WSACleanup();
		return ;
	}
	if (SOCKET_ERROR == send(sockClient, m_strContent, m_strContent.GetLength(), 0))
	{
		strErr.Format("状态:发送失败:%d", WSAGetLastError());
		GetDlgItem(IDC_STATIC_BCONNECT)->SetWindowText(strErr);
		closesocket(sockClient);
		WSACleanup();
		//获得系统时间显示发送内容
		CTime tm; tm = CTime::GetCurrentTime();
		iHour = tm.GetHour();
		iMinute = tm.GetMinute();
		iSecond = tm.GetSecond();
		strAdd.Format("%d:%d:%d  %s (发送失败)\r\n\r\n", iHour, iMinute, iSecond, m_strContent);
		m_EditResult.SetSel(-1);
		m_EditResult.ReplaceSel(strAdd);
		m_EditFail.SetSel(-1);
		m_EditFail.ReplaceSel(strAdd);
		return;
	}
	//获得系统时间显示发送内容
	CTime tm; tm = CTime::GetCurrentTime();
	iHour = tm.GetHour();
	iMinute = tm.GetMinute();
	iSecond = tm.GetSecond();
	strAdd.Format("%d:/%d:/%d  %s (发送成功) \r\n\r\n", iHour, iMinute, iSecond, m_strContent);
	m_EditResult.SetSel(-1);
	m_EditResult.ReplaceSel(strAdd);
	//关闭套接字  
	closesocket(sockClient);
	WSACleanup();
	return;
}


void   CALLBACK  CTCPClientDlg::TimerProc(HWND   hWnd, UINT   nMsg, UINT_PTR   nTimerid, DWORD   dwTime)
{
	m_TCPClient->UpdateData(TRUE);
	CString strAdd; //将时间+内容追加到控件中  
	CString strErr;

	//显示时间的变量
	int iHour;
	int iMinute;
	int iSecond;
	if (m_TCPClient->m_strContent.IsEmpty())
	{
		return;
	}
	//发送时采用长连接
	if (SOCKET_ERROR == send(m_TCPClient->m_SocketClient, m_TCPClient->m_strContent, m_TCPClient->m_strContent.GetLength(), 0))
	{
		strErr.Format("状态:发送失败:%d", WSAGetLastError());
		m_TCPClient->GetDlgItem(IDC_STATIC_BCONNECT)->SetWindowText(strErr);
		closesocket(m_TCPClient->m_SocketClient);
		WSACleanup();
		//获得系统时间显示发送内容
		CTime tm; tm = CTime::GetCurrentTime();
		iHour = tm.GetHour();
		iMinute = tm.GetMinute();
		iSecond = tm.GetSecond();
		strAdd.Format("%d:%d:%d  %s (定时发送失败)\r\n\r\n", iHour, iMinute, iSecond, m_TCPClient->m_strContent);
		m_TCPClient->m_EditResult.SetSel(-1);
		m_TCPClient->m_EditResult.ReplaceSel(strAdd);
		m_TCPClient->m_EditFail.SetSel(-1);
		m_TCPClient->m_EditFail.ReplaceSel(strAdd);
		m_TCPClient->KillTimer(TIMEID);
		CWnd* cwndBtStop = m_TCPClient->GetDlgItem(IDC_BUTTON_STOP);
		cwndBtStop->EnableWindow(FALSE);
		CWnd* cwndBtContinue = m_TCPClient->GetDlgItem(IDC_BUTTON_CON_SEND);
		cwndBtContinue->EnableWindow(TRUE);
		CWnd* cwndBtReContinue = m_TCPClient->GetDlgItem(IDC_BUTTON_RECONNECT);
		cwndBtReContinue->EnableWindow(TRUE);
		return;
	}
	//获得系统时间显示发送内容
	CTime tm; tm = CTime::GetCurrentTime();
	iHour = tm.GetHour();
	iMinute = tm.GetMinute();
	iSecond = tm.GetSecond();
	strAdd.Format("%d:%d:%d  %s (定时发送成功) \r\n\r\n", iHour, iMinute, iSecond, m_TCPClient->m_strContent);
	m_TCPClient->m_EditResult.SetSel(-1);
	m_TCPClient->m_EditResult.ReplaceSel(strAdd);
	//关闭套接字  
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

简单的TCP客户端发包工具 的相关文章

  • Windows与Ubuntu之间通过网线传输文件

    一 windows与Ubuntu之间网线直连搭建局域网 把网线连好后 xff0c 在两个系统中做以下设置 Windows下的配置 右键右下角的网络图标 xff08 或者右键网络 属性 xff09 更改适配器设置 以太网 右键属性 TCP I
  • Jetson TX2——CAN口的使用

    Jetson TX2 之CAN口的使用 TX2上有2个CAN控制器 xff0c CAN控制器需要通过CAN收发器连接到物理总线上 具体参阅原理图和相关技术参考手册 下载地址 xff1a https developer nvidia com
  • Jetson TX2——串口的使用(TTL-RS485)

    Jetson TX2之串口的使用 xff08 TTL RS485 xff09 TX2串口设备 TX2 有5个 UARTs 到主连接器 其中UART3 用于 WLAN BT 有关 UARTs 的典型任务 请参见下表 查看可用串口设备 xff1
  • 面试题知识点全纪录---容器

    注意 xff1a 该博客仅是本人对掌握知识的测试 xff0c 具体内容请移步guide哥网站 xff01 xff01 xff01 https snailclimb gitee io javaguide 链接 JAVA集合框架 https w
  • 高并发-消息队列

    一 消息队列 消息队列在分布式系统中主要是为了解耦和削峰 什么是消息队列 我们可以把消息队列看作是一个存放消息的容器 xff0c 当我们需要使用消息的时候 xff0c 直接从容器中取出消息供自己使用即可 消息队列是分布式系统中重要的组件之一
  • Ublox-M8N GPS接收机UBX协议解析

    Ublox M8N GPS接收机UBX协议解析 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61
  • Java清空List方法

    1 用list clear 方法清空list xff1b 用此方法 xff0c 其它引用该list的值也会变成空 2 用list 61 null来清空list 3 new ArrayList 来清空list
  • fastjson用java转json时间的格式化

    一 项目中需求遇到需要接收其他应用数据 xff0c 通过 64 RequestBody注解接收参数后 xff0c 到本地利用fastJson把json格式化 需要注意一下几点 xff1a 需要在调用JSON toJSONString 的时候
  • 工具类里面调用service接口或者mapper接口

    我们在开发中经常会遇到需要将一些频繁进行的操作抽取封装到工具类中 xff0c springboot不支持注入静态属性 所以在工具类中使用 64 Autowired或者其他注解自动注入会失败 xff0c 才用如下方法这可以避免注入失败 spa
  • windows下停止【kill】nginx命令

    杀死nginx taskkill fi 34 imagename eq nginx EXE 34 f taskkill f t im nginx exe stop bat taskkill f t im nginx exe pause
  • 基本类型对应的缓冲池

    基本类型对应的缓冲池如下 xff1a boolean values true and false all byte values short values between 128 and 127 int values between 128
  • 记录JVM中Eden区、Survivor from区和Survivor to区及Minor GC和Major GC的理解

    仅做学习笔记 JVM中Eden区 Survivor from区和Survivor to区 本文主要根据 深入理解JVM 中内存回收策略 xff0c 主要关注如下五个方面 xff1a 1 xff1a Eden区分配 2 xff1a 大对象直接
  • ubuntu下修改python默认版本的方法

    Ubuntu安装之后会面临多个python版本共存的问题 xff08 python2和python3 xff09 xff0c 但是有时候安装其他库的时候会安装在默认的python版本环境下 xff08 比如 xff0c 通常默认版本是pyt
  • C++:C语言实现HTTP的GET和POST请求

    https www cnblogs com diligenceday p 6255788 html
  • Linux C/C++ UDP Socket 网络通信

    Python微信订餐小程序课程视频 https edu csdn net course detail 36074 Python实战量化交易理财系统 https edu csdn net course detail 35475 昨晚 Vv 让
  • Xcode工程创建多个target

    Xcode工程创建多个target 小菜本人有时候会在一个Xcode工程中新建多个包含main函数的 m文件用于用于学习Objective C xff0c 于是要用到target这个东西 target对应于一个可运行文件和一些编译配置 点击
  • JLINK简介

    一 什么是JLINK JLINK是一个兼容JTAG的仿真器 xff0c 作用是烧入程序和Debug 二 JLINK是如何处理数据的 xff1f 1 PC端应用程序将数据以某种协议格式 xff0c 通过USB接口发送给J Link 2 J L
  • 蓝桥杯单片机-DS1302时钟模块

    一 简介 1 采用SPI三线接口通信 xff08 SCK SDA RST xff09 上升沿数据被写入DS1302 xff0c 下降沿被读出 二 应用 1 在ds1302 c文件中定义三个数组 unsigned char code READ
  • 蓝桥杯单片机-定时器

    一 简介 有三个寄存器与定时器相关 xff08 TMOD xff0c TCON xff0c 数值设置寄存器TH TL xff09 1 定时器工作方式设置寄存器TMOD GATE 门控制位 GATE 61 0时 定时器 计数器启动与停止仅受T
  • 蓝桥杯单片机-NE555模块

    一 简介 1 NE555在开发板中用于输出频率可变 xff0c 占空比不变的方波 2 NE555是纯硬件的设计 xff0c 通过电位器RB3可改变其信号输出频率 不需要编程实现其功能 考点 xff1a 使用定时器的计数模式测量NE555输出

随机推荐

  • C语言学习笔记(基于单片机)

    目录 一 关键字部分 static code const extern bit sbit sft struct xff08 结构体 xff09 1 结构体的初始化 2 结构体的赋值 3 应用 data idata pdata xdata 与
  • 蓝桥杯单片机-赛前总结

    目录 一 省赛中开发平台涉及的模块 xff1a 1 IIC驱动 2 DS1302驱动 3 onewire驱动 4 定时器读取NE555频率 二 一些功能性操作 1 外部中断 2 矩阵按键 3 PWM输出 4 毫秒延时函数 三 需要注意的一些
  • 相互依赖的so库,在编译时如何解耦

    有时候 xff0c 我们写的程序 xff0c 会涉及到相互引用的问题 比如frameworks av media libstagefright下的这个libstagefright xff0c 被frameworks av media lib
  • boost库学习总结

    第一次使用boost库是因为网络编程 xff0c 由于时间比较紧 xff0c 没有时间每个库都学 xff0c 所以前期想找个专门的boost库网络教程 xff08 以前自己就用过socket写过 xff0c 但是为了跨平台 xff0c 而且
  • C51单片机判断点亮的是奇数位还是偶数位

    学单片机的时候想到一个问题 xff1a 如何判断单片机点亮的LED灯是奇数位还是偶数位 xff1f 在网上搜了一圈没找到 xff0c 于是打算自己写一个 单片机型号 xff1a AT89C52 xff0c LED为低电平有效接法 xff0c
  • Linux学习笔记——如何在交叉编译时使用共享库

    0 前言 在较为复杂的项目中会利用到交叉编译得到的共享库 xff08 so文件 xff09 在这种情况下便会产生以下疑问 xff0c 例如 xff1a 1 交叉编译时的共享库是否需要放置于目标板中 xff0c 如果需要放置在哪个目录中 2
  • 实例变量(instance var)与属性(@property)的关系

    实例变量 instance var 与属性 64 property 的关系 Objective C 2 0之后 xff0c 声明一个 64 property name自动产生一个实例变量 xff0c 名为 name xff0c 因此省去实例
  • VS+CUDA+Matlab环境配置经验 (达到用matlab使用nvcc进行gpu并行加速)

    前前后后配了一个多星期的环境 xff0c 终于完成了 xff0c 梳理一下我的经验给大家分享也留作以后参考 一 版本兼容性问题 一开始安装的时候我并不懂 xff0c 没有什么顺序和版本的概念 xff0c 所以各种组件不能相互支持 首先明确
  • 华为无线WiFi配置802.1x认证

    一 拓扑 xff1a 二 简介 xff1a 本篇主要介绍华为交换机设备配合Windows server 2019配置的802 1x 43 NPS协同做的有线网络认证 xff08 可跟做 xff09 现有的华为6605无线AC配置 xff1a
  • 寝室一伙计

    我们寝室一伙计 xff0c 昨天晚上睡觉的时候 xff0c 说梦话 xff0c 笑 xff0c 磨牙 xff0c 还有吃奶 xff0c 等等等等 xff0c 我服了
  • Qt学习笔记(五)重定向

    实时获取程序中qt所输出的信息 xff0c 并显示到QTextBrowser上 1 在main文件中添加以下内容 xx为你的界面类名 xx clk 61 NULL void myMessageOutput QtMsgType type co
  • 串口通信中接收数据时延迟处理与缓存处理的解决方案(C#)

    利用串口进行通信 xff0c 当发送方 xff08 A xff09 将数据写入串口后 xff0c 通过无线或有线方式将数据传送给接收方 xff08 B xff09 xff0c B通过调用串口读方法comm read 参数 即可将数据读出 原
  • robomaster电控究极学习教程(以哨兵为例)------一、串口dma和遥控器

    robomaster电控究极学习教程 xff08 以哨兵为例 xff09 一 串口dma和遥控器 文章目录 robomaster电控究极学习教程 xff08 以哨兵为例 xff09 一 串口dma和遥控器 一 串口DMA的作用二 步骤1 c
  • 无人机架构

    无人机架构 基本设计需求 xff0c 如 xff1a xff08 1 xff09 慎思规划和反应式行为 xff1b xff08 2 xff09 容许不确定性 xff1b xff08 3 xff09 考虑危险 xff1b xff08 4 xf
  • 第八课 C++中的__LINE__宏

    在C 43 43 编程中 xff0c 我们有时候需要知道当前源代码的行号 xff0c 这时候就可以使用 LINE 宏 本文将介绍如何使用 LINE 宏 xff0c 以及它的使用示例 LINE 宏简介 LINE 是C 43 43 中的一个预定
  • 介绍@dynamic的用法

    介绍 64 dynamic的用法 Objective C 2 0提供了属性 64 property xff0c 可以让编译器自动生成setter和getter方法 如果不想编译器自作主张生成这些setter和getter方法 xff0c 则
  • OkHttpUtils的使用

    OkHttpUtils是一个非常好的网络协议框架 xff0c 它是在OkHttp的基础上进行了二次封装 要使用这个类首先下载jar包 xff0c 如下 xff1a http download csdn net download xxdw19
  • 十进制整数转为十六进制整数(C++实现)

    一 代码功能 xff1a 输入一个十进制整数 xff0c 将其转化为十六进制整数并输出 二 源码 include lt iostream gt include lt cstring gt include lt cmath gt using
  • 我的四轴专用PID参数整定方法及原理---超长文慎入(转)

    给四轴调了好久的PID xff0c 总算是调好了 xff0c 现分享PID参数整定的心得给大家 xff0c 还请大家喷的时候手下留情 首先说明一下 xff0c 这篇文章的主旨并不是直接教你怎么调 xff0c 而是告诉你这么调有什么道理 xf
  • 简单的TCP客户端发包工具

    一 TCP介绍 先放这里有时间在写 xff0c 最近在写DuiLib相关的使用内容 xff0c 这部分大家凑活着看 二 程序截图 下载链接 链接 xff1a https pan baidu com s 1MzNUzwd7WwBat6vNMc