我是想保证tcp监听一直在进行,而且收发数据是一直在循环中,实现数据收发一直进行。代码只包括tcp监听部分。
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92//创建线程,让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将死循环放在线程中内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复