MFC通过SOCKET建立TCP通信(VS2019)
前言
因项目需要构建上位机做服务器,连接客户端接收信息,经历过重写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

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

被折叠的 条评论
为什么被折叠?



