MFC异步Socket从零开始实现

  1. pch.h中引入socket头文件
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include<WinSock2.h>
#pragma comment(lib,"ws2_32.lib")

在这里插入图片描述
2. 在xxDlg.h中定义socket消息

#define WM_SOCKET WM_USER + 1000

在这里插入图片描述在类向导中添加消息,使用快捷键Ctrl+Shift+X打开类向导
在这里插入图片描述在这里插入图片描述

  1. xxDlg.h中定义相关对象
SOCKET sSocket, cSocket;//用于绑定和监听的服务端socket对象
sockaddr_in sAddr, cAddr;//用于服务绑定的地址结构
int clientAddrLen = sizeof(sockaddr_in);

在这里插入图片描述

  • xxDlg.cppOnInitDialog()函数中初始化socket
BOOL CMFCSocketAppDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	// Add "About..." menu item to system menu.

	// IDM_ABOUTBOX must be in the system command range.
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != nullptr)
	{
		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);
		}
	}

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon

	// TODO: Add extra initialization here
	//初始化socket库
	WSADATA wsaData;
	WORD wsaVersion = MAKEWORD(2, 0);
	WSAStartup(wsaVersion, &wsaData);

	//创建socket
	sSocket = socket(AF_INET, SOCK_STREAM, 0);
	if (INVALID_SOCKET == sSocket) {
		return TRUE;
	}

	//初始化一个用于服务绑定的地址结构
	sAddr.sin_family = AF_INET;
	sAddr.sin_addr.S_un.S_addr = INADDR_ANY;
	sAddr.sin_port = htons(9999);

	//绑定socket
	bind(sSocket, (sockaddr*)&sAddr, sizeof(sAddr));

	//监听socket
	listen(sSocket, 100);

	WSAAsyncSelect(sSocket, this->m_hWnd, WM_SOCKET, 
				   FD_ACCEPT | FD_READ | FD_WRITE | FD_CLOSE | FD_CONNECT);

	return TRUE;  // return TRUE  unless you set the focus to a control
}

在这里插入图片描述

  • OnSocket函数中代码
//wParam--->sSocket
//lParam--->FD_ACCEPT
afx_msg LRESULT CMFCSocketAppDlg::OnSocket(WPARAM wParam, LPARAM lParam)
{
	switch (lParam) {
	case FD_ACCEPT://socket的连接事件
		cSocket = accept(sSocket, (sockaddr*)&cAddr, &clientAddrLen);
		break;
	default:
		break;
	}

	return 0;
}

在这里插入图片描述

  • 查看是否有数据进入
    打开命令行窗口,输入telnet 127.0.0.1 9999

在这里插入图片描述

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值