void serial_task(void *pvParameters) //remote_command_task { char command[MAX_COMMAND_LENGTH]; char length_str[4]; uint8_t length; uint8_t mode; unsigned char ch; for (;;) { /* get length and mode */ xQueueReceive(uart_receive_queue, &length_str[0], portMAX_DELAY); xQueueReceive(uart_receive_queue, &length_str[1], portMAX_DELAY); xQueueReceive(uart_receive_queue, &length_str[2], portMAX_DELAY); xQueueReceive(uart_receive_queue, &mode, portMAX_DELAY); length = atoi(length_str); if(length >= MAX_COMMAND_LENGTH) { length = MAX_COMMAND_LENGTH-1; debug_msg("length is too long"); } for (uint8_t i = 0; i < length; i++) { xQueueReceive(uart_receive_queue, &ch, portMAX_DELAY); command[i] = ch; } command[length] = 0x00; handle_package(mode, command, length); } }
int main() { init(); pid_t pid; pid=fork(); if(pid==0) { handle_package(); } else if(pid>0) { menu(); } else { printf("ERROR!\n"); } return 0; }
int main_server_loop(Server_Object *server_obj) { IoTSocket new_socket; struct sockaddr_in address; int activity, i, valread,fdmax=65535; //first received buffer char buffer[MAXRECV]; TimeSpan timeout; timeout.tv_sec = 100; timeout.tv_usec = 0; //set of socket descriptors fd_set master, readfds; //Bind if (bind(server_obj->listener, (struct sockaddr *)&server_obj->address, sizeof(server_obj->address)) == -1) { printf("Main server Bind failed\n"); PAUSE; exit(EXIT_FAILURE); } puts("Main server Bind done"); //Listen to incoming connections listen(server_obj->listener, MAXCLIENTS); //Accept and incoming connection puts("Main server Waiting for incoming connections..."); #if defined(WIN32) int addrlen = sizeof(struct sockaddr_in); #elif defined(__linux__) || defined(__FreeBSD__) socklen_t addrlen = sizeof(struct sockaddr_in); #endif //clear the socket fd set FD_ZERO(&master); FD_ZERO(&readfds); //add listener socket to fd set FD_SET(server_obj->listener, &master); //fdmax = server_obj->listener + 1; while (1) { readfds = master; activity = select(MAXCLIENTS, &readfds, NULL, NULL, &timeout); if (activity == -1) { printf("Main server select call failed"); PAUSE; exit(EXIT_FAILURE); } //Add new connection into set if (FD_ISSET(server_obj->listener, &readfds)) { if ((new_socket = accept(server_obj->listener, (struct sockaddr *)&address, &addrlen))<0) { perror("accept"); PAUSE; exit(EXIT_FAILURE); } //inform user of socket number - used in send and receive commands printf("Main server has new connection , socket fd is %d , ip is : %s , port : %d \n", new_socket, inet_ntoa(address.sin_addr), ntohs(address.sin_port)); //add new socket to array of sockets for (i = 0; i < MAXCLIENTS; i++) { if (client_socket[i] == 0) { client_socket[i] = new_socket; FD_SET(new_socket, &master); printf("Main server adding a new item to list of sockets at index %d \n", i); packageBuffer[i] = generate_package_buffer(); break; } } } //handle connected conndetion,find which connection active for (i = 0; i < MAXCLIENTS; i++) { /* if (FD_ISSET(client_socket[i], &readfds)) { valread = recv(client_socket[i], buffer, MAXRECV, 0); if (valread <= 0) { //Somebody disconnected , get his details and print printf("Host disconnected , ip %s , port %d \n", inet_ntoa(address.sin_addr), ntohs(address.sin_port)); //Close the socket and mark as 0 in list for reuse FD_CLR(client_socket[i], &master); CloseIoTSocket(client_socket[i]); client_socket[i] = 0; free_package_buffer(packageBuffer[i]); packageBuffer[i] = NULL; } //Echo back the message that came in else if (valread>0) { //add null character, if you want to use with printf/puts or other string handling functions //buffer[valread] = '\0'; printf("FD_Index:%d\n", i); printf("%s:%d-", inet_ntoa(address.sin_addr), ntohs(address.sin_port)); printAllChar(buffer, valread); char buf[10]; strcpy(buf, "Hello"); //ms_sleep(4000); while (1) { send(client_socket[i], buf, 5, 0); ms_sleep(1000); printf("Sended\n"); } } } */ if (FD_ISSET(client_socket[i], &readfds)) { //get details of the client getpeername(client_socket[i], (struct sockaddr*)&address, &addrlen); //Check if it was for closing , and also read the incoming message //recv does not place a null terminator at the end of the string (whilst printf %s assumes there is one). memset(buffer, '\0', MAXRECV); valread = recv(client_socket[i], buffer, MAXRECV, 0); if (valread <= 0) { //Somebody disconnected , get his details and print printf("Main server got host disconnected , ip %s , port %d \n", inet_ntoa(address.sin_addr), ntohs(address.sin_port)); //Close the socket and mark as 0 in list for reuse FD_CLR(client_socket[i], &master); CloseIoTSocket(client_socket[i]); client_socket[i] = 0; free_package_buffer(packageBuffer[i]); packageBuffer[i] = NULL; } //Echo back the message that came in else if (valread>0) { /* printf("Received data[%d]", valread); printAllChar(buffer, valread); */ if (packageBuffer[i]->receiveCount+ valread > MAXRECV) { puts("Buffer over flow clear All buffer"); packageBuffer[i]->receiveCount = 0; memset(packageBuffer[i]->tempBuffer,'\0', MAXRECV); } else { charcat(packageBuffer[i]->tempBuffer, buffer, packageBuffer[i]->receiveCount, valread); packageBuffer[i]->receiveCount += valread; } //try to get a completed IoT Package recv_result result; do { IoT_Package package_info = generate_iot_package(); result = getCompletedPackage(packageBuffer[i]->tempBuffer, &packageBuffer[i]->receiveCount, &package_info); if (result== recv_result_COMPLETED) { package_info.belongSocketIdx = i; handle_package(&package_info); } free_package(&package_info); } while (result == recv_result_COMPLETED); if (packageBuffer[i]->receiveCount == 0) { printf("Buffer[%d] cleared2\n",i); } } } } } }