我是想保证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);
}
注意::所有函数都需要在头文件中进行声明!!!!!!!!