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"无效客户端shock\n");
                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);
}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

布丁小站

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值