IoT_Error_t iot_tls_read(Network *pNetwork, unsigned char *pMsg, size_t len, Timer *timer, size_t *read_len) { int val = -1; int recv_len = 0; fd_set fds; int time_left, error_flag = false, complete_flag = false; FD_ZERO(&fds); FD_SET(pNetwork->my_socket, &fds); setsockopt(pNetwork->my_socket, SOL_SOCKET, SO_RCVTIMEO, (void *)&pNetwork->tlsConnectParams.timeout_ms, sizeof(pNetwork->tlsConnectParams.timeout_ms)); do { if (tls_handle) { val = tls_recv(tls_handle, pMsg + recv_len, len - recv_len); } if (val >= 0) { recv_len += val; } else { error_flag = true; } if (recv_len >= len) { complete_flag = true; } time_left = left_ms(timer); } while (!error_flag && !complete_flag && time_left > 0); *read_len = recv_len; if (0 == *read_len && error_flag) { return NETWORK_SSL_NOTHING_TO_READ; } else if (has_timer_expired(timer) && !complete_flag) { return NETWORK_SSL_READ_TIMEOUT_ERROR; } return AWS_SUCCESS; }
int sendPacket(Client* c, int length, Timer* timer) { int rc = FAILURE, sent = 0; c->send_len = length; //add by yanly while (sent < length && !expired(timer)) { rc = c->ipstack->mqttwrite(c->ipstack, &c->buf[sent], length, left_ms(timer)); if (rc < 0) // there was an error writing the data break; sent += rc; } if (sent == length) { countdown(&c->ping_timer, c->keepAliveInterval); // record the fact that we have successfully sent the packet rc = SUCCESS; } else rc = FAILURE; c->send_len = 0; //add by yanly return rc; }
bool has_timer_expired(Timer *timer) { if (left_ms(timer) > 0) return false; else return true; }