while (true) { tv.tv_sec = 1; tv.tv_usec = 250000; FD_ZERO(&in_fds); FD_SET(hmiParameter->client, &in_fds); num = select(hmiParameter->client + 1, &in_fds, 0, 0, &tv); if (num > 0) { len = read(hmiParameter->client, buf, sizeof(buf)-1); if (len > 0){ frameLength = inputFrame.getLength(); if (frameLength > 300) { inputFrame.setLength(0); frameLength = inputFrame.getLength(); } for (int i = 0; i < len; i++) { frame[frameLength] = buf[i]; frameLength++; } inputFrame.setLength(frameLength); if (frameLength >= HEADER_LGTH) { Header head; inputFrame.getHeader(head); if (inputFrame.getDataLength() == head.length) { bool isCrcOk = crc.checkCRC(&inputFrame); if(isCrcOk) { // diag_printf("CRC ok\n"); hmiParameter->channel = CHANNEL_ETHERNET_TCP; handleReceivedFrame(&inputFrame); // cmdInterpreter->processFrame(&inputFrame); }else{ // TODO logg the comunication error. diag_printf("CRC error ! cmdNbr : %d cmdID : %d \n", inputFrame.getLineNumber(), inputFrame.getId()); // sendAcknowledge(false, head.numeroDeLigne); //This is only temporarly until.... // ....the communcication error listener is implemented. } inputFrame.setLength(0); }else{ inputFrame.setLength(0); } }else{ inputFrame.setLength(0); } // diag_printf("buf = '%s'\n", buf); }else{ disconnect(); ((Task*)(this))->delayFor(2000); connect(); } } else if (num == 0) { inputFrame.setLength(0); } else { diag_printf("ReceiverMain: Select error! \n"); disconnect(); ((Task*)(this))->delayFor(2000); connect(); } } void disconnect(){ if (hmiParameter->IPsocket != 0){ if (hmiParameter->client > 0){ close(hmiParameter->IPsocket); } diag_printf("HMI disconnected \n"); } connect() { : : : struct sockaddr_in local; int client_len; int one = 1; hmiParameter->IPsocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (hmiParameter->IPsocket < 0) { diag_printf("ReceiverMain: Invalid Socket \n"); } if (setsockopt(hmiParameter->IPsocket, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one))) { diag_printf("ReceiverMain: Setsockopt SO_REUSEADDR \n"); } if (!setsockopt(hmiParameter->IPsocket, SOL_SOCKET, SO_RCVTIMEO, 0, sizeof(0))) { diag_printf("Error Socket-option SO_RCVTIMEO \n"); } if (!setsockopt(hmiParameter->IPsocket, SOL_SOCKET, SO_SNDTIMEO, 0, sizeof(0))) { diag_printf("Error Socket-option SO_SNDTIMEO \n"); } if (!setsockopt(hmiParameter->IPsocket, SOL_SOCKET, SO_REUSEPORT, &one, sizeof(one))) { diag_printf("ReceiverMain: Setsockopt SO_REUSEPORT \n"); } // Set blocking: unsigned long y = 0; ioctlsocket(hmiParameter->IPsocket, FIONBIO, &y); memset(&local, 0, sizeof(local)); local.sin_family = AF_INET; local.sin_len = sizeof(local); local.sin_port = MAIN_IN_PORT; hmiParameter->client = 0; local.sin_addr.s_addr = INADDR_ANY; int retValue = bind(hmiParameter->IPsocket, (struct sockaddr *) &local, sizeof(local)); if (retValue < 0) { diag_printf("ReceiverMain: Bind error! \n"); }else{ retValue = listen(hmiParameter->IPsocket, SOMAXCONN); if (retValue < 0){ diag_printf("ReceiverMain: Listen error! \n"); }else{ client_len = sizeof(hmiParameter->hmiAddress); struct sockaddr_in client_addr; memset(&client_addr, 0, sizeof(client_addr)); socklen_t x = (socklen_t)&client_addr; if ((hmiParameter->client = accept(hmiParameter->IPsocket, (struct sockaddr *)&client_addr, &x)) < 0) { diag_printf("ReceiverMain: Accept Error! \n"); }else{ hmiParameter->hmiAddress = client_addr; hmiParameter->waitForAck = false; // modif ra, otherwise i can't use HMI for a machine allready running hmiParameter->lineNumber = 0; // modif ra, otherwise i can't use HMI for a machine allready running hmiParameter->timeoutTimerID = 0; // modif ra, otherwise i can't use HMI for a machine allready running client_len = sizeof(hmiParameter->hmiAddress); getpeername(hmiParameter->client, (struct sockaddr *)&hmiParameter->hmiAddress, (socklen_t *)&hmiParameter->hmiAddress); diag_printf("ReceiverMain: connection from %s:%d \n", inet_ntoa(hmiParameter->hmiAddress.sin_addr), ntohs(hmiParameter-> hmiAddress.sin_port)); } } } : : }