我是靠谱客的博主 花痴烤鸡,最近开发中收集的这篇文章主要介绍MFC将死循环放在线程中,防止阻塞,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

我是想保证tcp监听一直在进行,而且收发数据是一直在循环中,实现数据收发一直进行。代码只包括tcp监听部分。

//创建线程,让tcp连接一直在线程中运行,进入死循环,一直监测数据
//Cmodbus3Dlg是创建MFC时的类,好像是窗口类
UINT Cmodbus3Dlg::BurnIn_TheradFunc(LPVOID  lParam)
{
        //启动ws2环境
        WORD ver = MAKEWORD(2, 2);
        WSADATA dat;
        WSAStartup(ver, &dat);

        //1.创建socket
        SOCKET _sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

        //2.bind 绑定网络端口
        sockaddr_in _sin = {};
        _sin.sin_family = AF_INET;   //协议
        _sin.sin_port = htons(502);// 端口号
        _sin.sin_addr.S_un.S_addr = INADDR_ANY; //任意地址访问 //inet_addr("127.0.0.1");本机访问
        while (1)
        {
            if (SOCKET_ERROR == bind(_sock, (sockaddr*)&_sin, sizeof(_sin))) {

                OutputDebugString(L"绑定失败n");
            }
            else {

                OutputDebugString(L"绑定成功n");
            }

            // 3. listen 监听网络端口
            if (SOCKET_ERROR == listen(_sock, 5)) {
                OutputDebugString(L"监听失败n");
            }
            else {

                OutputDebugString(L"监听成功n");
            }
            //4. accept 等待客户端连接。
            sockaddr_in clientAddr = {};
            int nAddrLen = sizeof(sockaddr_in);
            SOCKET _cSock = INVALID_SOCKET;

            _cSock = accept(_sock, (sockaddr*)&clientAddr, &nAddrLen);
            if (INVALID_SOCKET == _cSock) {
                OutputDebugString(L"无效客户端shockn");
                break;
            }
            OutputDebugString(L"有新的ip加入n");
            /* TRACE("有新的ip加入");*/

            char buff[BUF_SIZE] = { 0 };
            bool IsStart = false;
            while (1) {
                int strLen = recv(_cSock, buff, BUF_SIZE, 0);         //接收客户端发来的数据,recv返回的是字节数

                if (strLen == 0)
                {
                    OutputDebugString(L"客户端连接关闭n");
                    break;
                }
                else if (strLen < 0)
                {
                    OutputDebugString(L"连接失败n");
                    break;
                }
                int length = buff[5];                                  //MBAP报文头,2+2+2+1   功能码1+起始地址2+数量2

                for (int i = 0; i < 12; i++)
                {
                    TRACE("0x0%x ", buff[i]);  //显示主站的请求报文           
                }
                OutputDebugString(L"n");

                solve_all(_cSock, (unsigned char*)buff);                                //根据功能码进行相应处理,从站返回相应报文

                memset(buff, 0, BUF_SIZE);                               //重置缓冲区
              /*  Sleep(1000);*/

            }

        }
        //6.关闭网络套接字
        closesocket(_sock);
        WSACleanup();
        return 1;
}


//点击连接按键,开始创建线程执行官线程中的内容
void Cmodbus3Dlg::OnBnClickedButton1()
{
    pThread = AfxBeginThread(BurnIn_TheradFunc, (LPVOID)this);
}

注意::所有函数都需要在头文件中进行声明!!!!!!!! 

最后

以上就是花痴烤鸡为你收集整理的MFC将死循环放在线程中,防止阻塞的全部内容,希望文章能够帮你解决MFC将死循环放在线程中,防止阻塞所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(50)

评论列表共有 0 条评论

立即
投稿
返回
顶部