void DomoticzTCP::Do_Work() { char buf[100]; int sec_counter = 0; while (!m_stoprequested) { if ( (m_socket == INVALID_SOCKET)&& (!m_stoprequested) ) { sleep_seconds(1); sec_counter++; if (sec_counter % 12 == 0) { mytime(&m_LastHeartbeat); } if (m_stoprequested) break; m_retrycntr++; if (m_retrycntr>=RETRY_DELAY) { m_retrycntr=0; if (!ConnectInternal()) { _log.Log(LOG_STATUS,"Domoticz: retrying in %d seconds...",RETRY_DELAY); } } } else { //this could take a long time... maybe there will be no data received at all, //so it's no good to-do the heartbeat timing here m_LastHeartbeat = mytime(NULL); int bread=recv(m_socket,(char*)&buf,sizeof(buf),0); if (m_stoprequested) break; if (bread<=0) { _log.Log(LOG_ERROR,"Domoticz: TCP/IP connection closed! %s",m_szIPAddress.c_str()); closesocket(m_socket); m_socket=INVALID_SOCKET; if (!m_stoprequested) { _log.Log(LOG_STATUS,"Domoticz: retrying in %d seconds...",RETRY_DELAY); m_retrycntr=0; continue; } } else { boost::lock_guard<boost::mutex> l(readQueueMutex); onRFXMessage((const unsigned char *)&buf,bread); } } } _log.Log(LOG_STATUS,"Domoticz: TCP/IP Worker stopped..."); }
// Runs on STS thread void UDPSocketParent::DoConnect(nsCOMPtr<nsIUDPSocket>& aSocket, nsCOMPtr<nsIEventTarget>& aReturnThread, const UDPAddressInfo& aAddressInfo) { UDPSOCKET_LOG(("%s: %s:%u", __FUNCTION__, aAddressInfo.addr().get(), aAddressInfo.port())); if (NS_FAILED(ConnectInternal(aAddressInfo.addr(), aAddressInfo.port()))) { SendInternalError(aReturnThread, __LINE__); return; } CheckSTSThread(); nsCOMPtr<nsINetAddr> localAddr; aSocket->GetLocalAddr(getter_AddRefs(localAddr)); nsCString addr; if (NS_FAILED(localAddr->GetAddress(addr))) { SendInternalError(aReturnThread, __LINE__); return; } uint16_t port; if (NS_FAILED(localAddr->GetPort(&port))) { SendInternalError(aReturnThread, __LINE__); return; } UDPSOCKET_LOG(("%s: SendConnectResponse: %s:%u", __FUNCTION__, addr.get(), port)); SendConnectResponse(aReturnThread, UDPAddressInfo(addr, port)); }
void Wiimote::ThreadFunc() { Common::SetCurrentThreadName("Wiimote Device Thread"); bool ok = ConnectInternal(); SetReady(); if (!ok) { return; } // main loop while (IsConnected() && m_run_thread) { if (m_need_prepare) { m_need_prepare = false; if (!PrepareOnThread()) { ERROR_LOG(WIIMOTE, "Wiimote::PrepareOnThread failed. Disconnecting Wiimote %d.", index + 1); break; } } Write(); Read(); } DisconnectInternal(); }
void P1MeterTCP::Do_Work() { while (!m_stoprequested) { if ( (m_socket == INVALID_SOCKET)&& (!m_stoprequested) ) { sleep_seconds(1); time_t atime = mytime(NULL); struct tm ltime; localtime_r(&atime, <ime); if (ltime.tm_sec % 12 == 0) { mytime(&m_LastHeartbeat); } m_retrycntr++; if (m_retrycntr>=RETRY_DELAY) { m_retrycntr=0; if (!ConnectInternal()) { _log.Log(LOG_STATUS,"P1 Smart Meter: retrying in %d seconds...", RETRY_DELAY); continue; } } } else { unsigned char data[1028]; int bread=recv(m_socket,(char*)&data,sizeof(data),0); if (m_stoprequested) break; mytime(&m_LastHeartbeat); if ((bread==0)||(bread<0)) { _log.Log(LOG_ERROR,"P1 Smart Meter: TCP/IP connection closed!"); closesocket(m_socket); m_socket=INVALID_SOCKET; if (!m_stoprequested) { _log.Log(LOG_STATUS,"P1 Smart Meter: retrying in %d seconds...", RETRY_DELAY); m_retrycntr=0; continue; } } else { boost::lock_guard<boost::mutex> l(readQueueMutex); ParseData((const unsigned char*)&data,bread); } } } _log.Log(LOG_STATUS,"P1 Smart Meter: TCP/IP Worker stopped..."); }
void CurrentCostMeterTCP::Do_Work() { int sec_counter = 0; while (!m_stoprequested) { if ( (m_socket == INVALID_SOCKET)&& (!m_stoprequested) ) { sleep_seconds(1); sec_counter++; if (sec_counter % 12 == 0) { m_LastHeartbeat=mytime(NULL); } m_retrycntr++; if (m_retrycntr>=RETRY_DELAY) { m_retrycntr=0; if (!ConnectInternal()) { _log.Log(LOG_STATUS,"CurrentCost Smart Meter: retrying in %d seconds...", RETRY_DELAY); continue; } } } else { char data[1028]; int bread=recv(m_socket,data,sizeof(data),0); if (m_stoprequested) break; m_LastHeartbeat=mytime(NULL); if ((bread==0)||(bread<0)) { _log.Log(LOG_ERROR,"CurrentCost Smart Meter: TCP/IP connection closed!"); closesocket(m_socket); m_socket=INVALID_SOCKET; if (!m_stoprequested) { _log.Log(LOG_STATUS,"CurrentCost Smart Meter: retrying in %d seconds...", RETRY_DELAY); m_retrycntr=0; continue; } } else { boost::lock_guard<boost::mutex> l(readQueueMutex); ParseData(data, bread); } } } _log.Log(LOG_STATUS,"CurrentCost Smart Meter: TCP/IP Worker stopped..."); }
NS_IMETHODIMP sbIPDDevice::Connect() { nsresult rv; // Connect. Disconnect on error. rv = ConnectInternal(); if (NS_FAILED(rv)) Disconnect(); return rv; }
void Wiimote::ThreadFunc() { Common::SetCurrentThreadName("Wiimote Device Thread"); bool ok = ConnectInternal(); if (!ok) { // try again, it might take a moment to settle Common::SleepCurrentThread(100); ok = ConnectInternal(); } SetReady(); if (!ok) { return; } // main loop while (IsConnected() && m_run_thread.load()) { if (m_need_prepare.load()) { m_need_prepare.store(false); if (!PrepareOnThread()) { ERROR_LOG(WIIMOTE, "Wiimote::PrepareOnThread failed. Disconnecting Wiimote %d.", m_index + 1); break; } } Write(); Read(); } DisconnectInternal(); }
void SolarMaxTCP::Do_Work() { char buf[1024]; bool bFirstTime = true; int sec_counter = POLL_INTERVAL-5; while (!m_stoprequested) { sleep_seconds(1); sec_counter++; if (sec_counter % 12 == 0) { m_LastHeartbeat=mytime(NULL); } if ( (m_socket == INVALID_SOCKET) && (!m_stoprequested) ) { if (m_stoprequested) break; m_retrycntr++; if (m_retrycntr >= RETRY_DELAY) { m_retrycntr = 0; if (!ConnectInternal()) { _log.Log(LOG_STATUS, "SolarMax: retrying in %d seconds...", RETRY_DELAY); } } } else { if ((sec_counter % POLL_INTERVAL == 0) || (bFirstTime)) { bFirstTime = false; //Request data from inverter std::string reqString = MakeRequestString(); write(reqString.c_str(), reqString.size()); //this could take a long time... maybe there will be no data received at all, //so it's no good to-do the heartbeat timing here int bread = recv(m_socket, (char*)&buf, sizeof(buf), 0); if (m_stoprequested) break; if (bread <= 0) { _log.Log(LOG_ERROR, "SolarMax: TCP/IP connection closed! %s", m_szIPAddress.c_str()); closesocket(m_socket); m_socket = INVALID_SOCKET; if (!m_stoprequested) { _log.Log(LOG_STATUS, "SolarMax: retrying in %d seconds...", RETRY_DELAY); m_retrycntr = 0; continue; } } else { boost::lock_guard<boost::mutex> l(readQueueMutex); ParseData((const unsigned char *)&buf, bread); } } } } _log.Log(LOG_STATUS, "SolarMax: TCP/IP Worker stopped..."); }