MFC通过SOCKET建立TCP通信(VS2019)

本文通过实例详细讲解了如何在MFC中使用SOCKET建立TCP通信,包括服务端的初始化、数据接收,客户端的连接和发送,以及多线程在处理通信中的作用。还展示了简单的效果演示,并探讨了扩展到连接多个客户端的可能性。


前言

因项目需要构建上位机做服务器,连接客户端接收信息,经历过重写CScoket类,最后发现可以直接用SOCKET类型实现功能,并借此机会学习到了多线程相关的知识与实现。做一个简单的记录与分享


提示:以下是本篇文章正文内容,下面案例可供参考

一、SOCKET服务端

1.服务器过程说明

服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。当建立好连接后,创建连接套接字,即可接收客户端传递来的数据(recv),当发现接收超时后,可以自动关闭与客户端连接后建立的套接字。

2.函数实现

(1)建立一个MFC工程,基于对话框,放置一个Edit Control用来显示连接信息和一个Listbox Control用来显示接收到的数据,分别添加变量(在控件上点击右键)
在这里插入图片描述
  CEdit show_edit;
  CListBox m_list;
(2)在对话框头文件中,定义接收到的数据结构体,并定义一个服务器线程

typedef struct
{
   
   
	unsigned short current[31];	//31次谐波电流
	unsigned short cosphi;		//功率因素
}stCur, * pstCur;

UINT Server_Th(LPVOID p);	//服务器线程

(3)在对话框源文件中,包含网络通信相关的标准头文件并连接库

#include <WinSock2.h>
#pragma commment(lib,"WS2_32.lib")	

(4)在源文件中定义相关的变量(全局变量)

SOCKET listen_sock;	//服务器套接字
SOCKET sock;	//连接客户端套接字
int res = -1;	//接收到数据的个数
UINT num = 0;	//超时接收数据的计数次数
stCur mydata[10];	//保存接收到数据的数组

(5)实现服务器线程函数(核心和重要的语句都有详细的注释)

UINT Server_Th(LPVOID p)
{
   
   
	SOCKADDR_IN local_addr;		//记录本地地址族
	SOCKADDR_IN client_addr;	//记录连接客户端地址族
	int iaddrSize = sizeof(SOCKADDR_IN);	//地址信息长度
	
	CMyServerDlg* dlg = (CMyServerDlg*)AfxGetApp()->GetMainWnd();	
	//获取主线程的对话框句柄,可以在子线程中操作主线程函数、对象

	local_addr.sin_family = AF_INET;		//用ipv4地址(32位的)与端口号(16位的)的组合
	local_addr.sin_port = htons(14311);		//监听端口号
	local_addr.sin_addr.s_addr = htonl(INADDR_ANY);	//转换过来就是0.0.0.0,泛指本机的意思

	if ((listen_sock = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)	//以流式套接字,TCP协议创建socket
	{
   
   
		(dlg->show_edit).ReplaceSel(_T("创建监听失败\r\n"));
	}
	if (bind(listen_sock, (struct sockaddr*)&local_addr, sizeof(SOCKADDR_IN)))//将地址族中的ipv4地址和端口号赋值给socket
	
评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值