libmodbus modbustcp 支持多连接
关键字:libmodbus 支持多连接
关键字:libmodbus modbustcp 解决只能连接一个的问题
modbus_t *_mbCxt;
int _modbusSocket;
-------------启动函数
_mbCxt = modbus_new_tcp("0.0.0.0", 502);
modbus_set_debug(_mbCxt, true);
_modbusSocket = modbus_tcp_listen(_mbCxt, 10);
if(_modbusSocket==-1)
{
printf("modbus linsten err is: %s\n", modbus_strerror(errno));
}
int iRet = pthread_create(&_hThreadHandle, NULL, TcpModbusGate::Run, this);
printf("--listening--....");
------
void* TcpModbusGate::Run(void *pParam)
{
TcpModbusGate* pThis = (TcpModbusGate*)pParam;
uint8_t bufCmd[100];
int fdNum=0;
int fdMax=0;
int iReaded =0;
fd_set fdReads;
fd_set fdCpyeads;
FD_ZERO(&fdReads);
FD_SET(pThis->_modbusSocket, &fdReads);
fdMax = pThis->_modbusSocket;
while (true)
{
fdCpyeads = fdReads;
//printf("1) fdMax:%d socketserver:%d \n", fdMax, pThis->_modbusSocket);
if ((fdNum=select(fdMax+1, &fdCpyeads, 0,0,0))==-1){
printf("socket error...(1)\n ");
break;
}
if (fdNum==0){
continue;
}
for (int i=0; i<fdMax+1; i++){
if (!FD_ISSET(i, &fdCpyeads))
continue;
if (i==pThis->_modbusSocket){
int nsocket = modbus_tcp_accept(pThis->_mbCxt, &pThis->_modbusSocket);
if ( (nsocket == -1) || (pThis->_modbusSocket==-1) ){
printf("socket error connect;");
continue;
}
//printf("new sockid is:%l \n", nsocket);
FD_SET(nsocket, &fdReads);
if (fdMax<nsocket){
fdMax = nsocket;
printf("cur max sockid is:%d \n", fdMax);
}
}else{
//printf("cur idx selected return :%d \n", i);
modbus_set_socket(pThis->_mbCxt, i); //---------------------------------------核心这一句,和后面返回后设置当前socket句柄为服务器句柄
iReaded = modbus_receive(pThis->_mbCxt, bufCmd);
if (iReaded==0){
// 可能是关闭
printf("接收到数据为0, 可能是关闭单个客户端?\n");
}else if (iReaded >0){
//modbus_reply(pThis->_mbCxt, bufCmd, iReaded, pThis->_mapping);
int iDevAddr=0;
int iFun=0;
int iRegAddr=0;
int iRegCount=0;
//printf("reced cmd data len::%d\n", iReaded);
bool isCmd = pThis->AnyCmd(bufCmd, iReaded, iDevAddr, iFun, iRegAddr, iRegCount);
if (isCmd){
}else{
}
}else{
printf("可能是关闭单个客户端?\n");
FD_CLR(i, &fdReads);
}
modbus_set_socket(pThis->_mbCxt, pThis->_modbusSocket); //---------------------------------------核心这一句,和后面返回后设置当前socket句柄为服务器句柄
}
}
}
printf("socket error? \n");
//pThis->
}