MFC 制作socket服务端

界面配置

一个IP Control、一个Button Control,5个Edit Control
在这里插入图片描述建立两个文件,如下图所示:
在这里插入图片描述
TcpClient.h中代码如下:

#pragma once
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#define _CRT_SECURE_NO_WARNINGS

#include<winsock2.h>
#pragma comment(lib,"ws2_32.lib")

#define err(errMsg) printf("[line:%d]%s failed code %d\n",__LINE__,errMsg,WSAGetLastError())

class Client
{
public:
	Client(char *m_ip, int m_port);

	bool init_Socket();//打开网络库

	bool close_Socket(SOCKET serverSock);//关闭网络库

	SOCKET createServerSocket();//创建服务器socket

	SOCKET createClientSocket();//创建客户端socket

private:
	char *m_ip;
	int m_port;
};

TcpClient.cpp中代码如下:

#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include "pch.h"
#include "TcpClient.h"

Client::Client(char *m_ip, int m_port)
{
	this->m_ip = m_ip;
	this->m_port = m_port;
}

bool Client::init_Socket()
{
	WSADATA wsadata;
	if (0 != WSAStartup(MAKEWORD(2, 2), &wsadata)) {
		//err("WSAStartup");
		CString str;
		str.Format(_T("WSAStartup Failed!"));
		AfxMessageBox(str, MB_OKCANCEL | MB_ICONINFORMATION, 0);

		return false;
	}
	return true;
}

bool Client::close_Socket(SOCKET serverSock)
{
	closesocket(serverSock);
	if (0 != WSACleanup()) {
		//err("WSACleanup");
		CString str;
		str.Format(_T("WSACleanup Failed!"));
		AfxMessageBox(str, MB_OKCANCEL | MB_ICONINFORMATION, 0);

		return true;
	}
	return true;
}

SOCKET Client::createClientSocket()
{
	SOCKET fd = socket(AF_INET, SOCK_STREAM, 0);
	if (fd == INVALID_SOCKET) {
		//err("socket");
		CString str;
		str.Format(_T("socket Failed!"));
		AfxMessageBox(str, MB_OKCANCEL | MB_ICONINFORMATION, 0);

		return INVALID_SOCKET;
	}

	//2 与服务器建立连接 
	sockaddr_in addr;
	addr.sin_family = AF_INET;	//和创建socket时的必须一样
	addr.sin_port = htons(m_port);	//大端存储 小端存储
	addr.sin_addr.S_un.S_addr = inet_addr(m_ip);
	if (INVALID_SOCKET == connect(fd, (struct sockaddr*)&addr, sizeof(addr))) {
		//err("connect");
		CString str;
		str.Format(_T("Connect Failed!"));
		AfxMessageBox(str, MB_OKCANCEL | MB_ICONINFORMATION, 0);

		return false;
	}

	return fd;
}

#if(1)
SOCKET Client::createServerSocket()
{
	SOCKET fd = socket(AF_INET, SOCK_STREAM, 0);
	if (fd == INVALID_SOCKET) {
		//err("socket");
		CString str;
		str.Format(_T("Socket Failed!"));
		AfxMessageBox(str, MB_OKCANCEL | MB_ICONINFORMATION, 0);

		return INVALID_SOCKET;
	}

	//2 给socket绑定ip地址和端口号 
	sockaddr_in addr;
	addr.sin_family = AF_INET;	//和创建socket时的必须一样
	addr.sin_port = htons(m_port);	//大端存储 小端存储
	//addr.sin_addr.S_un.S_addr = ADDR_ANY;
	addr.sin_addr.S_un.S_addr = inet_addr(m_ip);

	if (SOCKET_ERROR == bind(fd, (struct sockaddr*)&addr, sizeof(addr))) {
		//err("bind");
		CString str;
		str.Format(_T("Bind Failed!"));
		AfxMessageBox(str, MB_OKCANCEL | MB_ICONINFORMATION, 0);

		return false;
	}

	//3 监听电话
	listen(fd, 10);

	return fd;
}
#endif

xxDlg.cpp中按钮点击事件对应的代码:

void CdemoDlg::OnBnClickedConnect()
{
	UpdateData(TRUE);

	CString txtIP, txtPort;
	char charIP[50]; //转换后IP将要储存的位置
	
	CString DefaultIP = _T("192.168.1.200");
	CString DefaultPort = _T("8800");

	m_IPAddress.GetWindowText(txtIP); //获取控件中的IP地址
	GetDlgItem(IDC_EDIT_PORT)->GetWindowText(txtPort); //获取控件中的端口号地址

	CString2Char(txtIP, charIP);

	//比较CString对象
	if (txtIP.Compare(DefaultIP))
	//if (wcscmp(IPAddr1, strx)) 
	{
		MessageBox(_T("请输入正确的IP地址"), _T("温馨提示 "), MB_OK);
	}
	else {
		//MessageBox(_T("正确的IP地址"));
		if (txtPort.SpanIncluding(_T("0123456789.")) != txtPort)
		{
			MessageBox(_T("输入端口号不是数字!"), _T("温馨提示 "), MB_OK);
		}
		else {
			if (wcscmp(txtPort, DefaultPort)) {
				MessageBox(_T("请输入正确的端口号"), _T("温馨提示 "), MB_OK);
			}
			else {
				//MessageBox(_T("正确的IP端口号"));
				Client client(charIP, _ttoi(txtPort));
				//Client client("192.168.1.200", 8800);
				client.init_Socket();
				SOCKET serverSock =client.createClientSocket();

				//将控件里的内容 同步到变量中
				UpdateData(TRUE);
				

				//设置范围 协议15,20,3,3
				sendBuf[0] = 0xAA;    //帧头
				sendBuf[1] = 0X01;      //参数设置
				sendBuf[2] = 0X03;      //最近距离


				if (m_brake.SpanIncluding(_T("0123456789.")) != m_brake)
				{
					MessageBox(_T("输入的刹车距离不是数字!"), _T("温馨提示 "), MB_OK);
				}
				else
				{
					//MessageBox(_T("该输入是数字!"), _T("温馨提示 "), MB_OK);
					if (_ttoi(m_brake) > 15)
					{
						MessageBox(_T("该数值超限,请重新输入刹车距离"), _T("温馨提示 "), MB_OK);
					}
					else
					{
						sendBuf[3] = _ttoi(m_brake); //15
						if (m_warning.SpanIncluding(_T("0123456789.")) != m_warning)
						{
							MessageBox(_T("输入的报警距离不是数字!"), _T("温馨提示 "), MB_OK);
						}
						else
						{
							if (_ttoi(m_warning) > 20)
							{
								MessageBox(_T("该数值超限,请重新输入警告距离"), _T("温馨提示 "), MB_OK);
							}
							else if (_ttoi(m_brake) > _ttoi(m_warning))
							{
								MessageBox(_T("刹车距离大于报警距离,请重新输入"), _T("温馨提示 "), MB_OK);
							}
							else
							{
								sendBuf[4] = _ttoi(m_warning); //20
								if (m_left.SpanIncluding(_T("0123456789.")) != m_left)
								{
									MessageBox(_T("输入的左面距离不是数字!"), _T("温馨提示 "), MB_OK);
								}
								else
								{
									if (_ttoi(m_left) > 20)
									{
										MessageBox(_T("该数值超限,请重新输入左面距离"), _T("温馨提示 "), MB_OK);
									}
									else
									{
										sendBuf[5] = _ttoi(m_left); //20
										if (m_right.SpanIncluding(_T("0123456789.")) != m_right)
										{
											MessageBox(_T("输入的右面距离不是数字!"), _T("温馨提示 "), MB_OK);
										}
										else
										{
											if (_ttoi(m_right) > 20)
											{
												MessageBox(_T("该数值超限,请重新输入右面距离"), _T("温馨提示 "), MB_OK);
											}
											else
											{
												sendBuf[6] = _ttoi(m_right); //20
												sendBuf[7] = 0XFF;    //帧尾
												MessageBox(_T("数据已更新"), _T("温馨提示 "), MB_OK);
#if(0)
												CString string;
												string.Format(_T("%d"), sendBuf[6]); //将变量组装到字符串中
												MessageBox(string,_T("温馨提示"),MB_OK);
#endif
												if (SOCKET_ERROR == send(serverSock, sendBuf, strlen(sendBuf), 0))
												{
													MessageBox(_T("数据发送失败"), _T("温馨提示 "), MB_OK);
												}
												else {
													MessageBox(_T("数据发送成功"), _T("温馨提示 "), MB_OK);
													
													client.close_Socket(serverSock);
												}
											}
										}
									}
								}
							}
						}
					}
				}
			}
		}
	}
}

ps:代码有诸多瑕疵,改进中。。。。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值