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->
}
posted @ 2023-02-16 17:41  吉瓦吴老师  阅读(864)  评论(0编辑  收藏  举报