void socketio_destroy(CONCRETE_IO_HANDLE socket_io) { if (socket_io != NULL) { SOCKET_IO_INSTANCE* socket_io_instance = (SOCKET_IO_INSTANCE*)socket_io; /* we cannot do much if the close fails, so just ignore the result */ if (socket_io_instance->socket != INVALID_SOCKET) { close(socket_io_instance->socket); } /* clear allpending IOs */ LIST_ITEM_HANDLE first_pending_io = list_get_head_item(socket_io_instance->pending_io_list); while (first_pending_io != NULL) { PENDING_SOCKET_IO* pending_socket_io = (PENDING_SOCKET_IO*)list_item_get_value(first_pending_io); if (pending_socket_io != NULL) { free(pending_socket_io->bytes); free(pending_socket_io); } (void)list_remove(socket_io_instance->pending_io_list, first_pending_io); first_pending_io = list_get_head_item(socket_io_instance->pending_io_list); } list_destroy(socket_io_instance->pending_io_list); free(socket_io_instance->hostname); free(socket_io); } }
void socketio_destroy(CONCRETE_IO_HANDLE socket_io) { if (socket_io != NULL) { SOCKET_IO_INSTANCE* socket_io_instance = (SOCKET_IO_INSTANCE*)socket_io; tcpsocketconnection_destroy(socket_io_instance->tcp_socket_connection); /* clear all pending IOs */ LIST_ITEM_HANDLE first_pending_io = list_get_head_item(socket_io_instance->pending_io_list); while (first_pending_io != NULL) { PENDING_SOCKET_IO* pending_socket_io = (PENDING_SOCKET_IO*)list_item_get_value(first_pending_io); if (pending_socket_io != NULL) { free(pending_socket_io->bytes); free(pending_socket_io); } (void)list_remove(socket_io_instance->pending_io_list, first_pending_io); first_pending_io = list_get_head_item(socket_io_instance->pending_io_list); } list_destroy(socket_io_instance->pending_io_list); free(socket_io_instance->hostname); free(socket_io); } }
void socketio_dowork(CONCRETE_IO_HANDLE socket_io) { if (socket_io != NULL) { SOCKET_IO_INSTANCE* socket_io_instance = (SOCKET_IO_INSTANCE*)socket_io; if (socket_io_instance->io_state == IO_STATE_OPEN) { int received = 1; LIST_ITEM_HANDLE first_pending_io = list_get_head_item(socket_io_instance->pending_io_list); while (first_pending_io != NULL) { PENDING_SOCKET_IO* pending_socket_io = (PENDING_SOCKET_IO*)list_item_get_value(first_pending_io); if (pending_socket_io == NULL) { socket_io_instance->io_state = IO_STATE_ERROR; indicate_error(socket_io_instance); LogError("Failure: retrieving socket from list"); break; } int send_result = send(socket_io_instance->socket, pending_socket_io->bytes, pending_socket_io->size, 0); if (send_result != pending_socket_io->size) { if (send_result == INVALID_SOCKET) { free(pending_socket_io->bytes); free(pending_socket_io); (void)list_remove(socket_io_instance->pending_io_list, first_pending_io); LogError("Failure: sending Socket information"); socket_io_instance->io_state = IO_STATE_ERROR; indicate_error(socket_io_instance); } else { /* simply wait */ (void)memmove(pending_socket_io->bytes, pending_socket_io->bytes + send_result, pending_socket_io->size - send_result); } } else { if (pending_socket_io->on_send_complete != NULL) { pending_socket_io->on_send_complete(pending_socket_io->callback_context, IO_SEND_OK); } free(pending_socket_io->bytes); free(pending_socket_io); if (list_remove(socket_io_instance->pending_io_list, first_pending_io) != 0) { socket_io_instance->io_state = IO_STATE_ERROR; indicate_error(socket_io_instance); LogError("Failure: unable to remove socket from list"); } } first_pending_io = list_get_head_item(socket_io_instance->pending_io_list); } while (received > 0) { unsigned char* recv_bytes = malloc(RECEIVE_BYTES_VALUE); if (recv_bytes == NULL) { LogError("Socketio_Failure: NULL allocating input buffer."); indicate_error(socket_io_instance); } else { received = recv(socket_io_instance->socket, recv_bytes, RECEIVE_BYTES_VALUE, 0); if (received > 0) { int i; for (i = 0; i < received; i++) { LOG(socket_io_instance->logger_log, 0, "<-%02x ", (unsigned char)recv_bytes[i]); } if (socket_io_instance->on_bytes_received != NULL) { /* explictly ignoring here the result of the callback */ (void)socket_io_instance->on_bytes_received(socket_io_instance->on_bytes_received_context, recv_bytes, received); } } free(recv_bytes); } } } } }
void socketio_dowork(CONCRETE_IO_HANDLE socket_io) { if (socket_io != NULL) { SOCKET_IO_INSTANCE* socket_io_instance = (SOCKET_IO_INSTANCE*)socket_io; if (socket_io_instance->io_state == IO_STATE_OPEN) { int received = 1; LIST_ITEM_HANDLE first_pending_io = list_get_head_item(socket_io_instance->pending_io_list); while (first_pending_io != NULL) { PENDING_SOCKET_IO* pending_socket_io = (PENDING_SOCKET_IO*)list_item_get_value(first_pending_io); if (pending_socket_io == NULL) { socket_io_instance->io_state = IO_STATE_ERROR; indicate_error(socket_io_instance); break; } int send_result = send(socket_io_instance->socket, pending_socket_io->bytes, pending_socket_io->size, 0); if (send_result != pending_socket_io->size) { if (send_result == INVALID_SOCKET) { free(pending_socket_io->bytes); free(pending_socket_io); (void)list_remove(socket_io_instance->pending_io_list, first_pending_io); socket_io_instance->io_state = IO_STATE_ERROR; indicate_error(socket_io_instance); } else { /* simply wait */ (void)memmove(pending_socket_io->bytes, pending_socket_io->bytes + send_result, pending_socket_io->size - send_result); } } else { if (pending_socket_io->on_send_complete != NULL) { pending_socket_io->on_send_complete(pending_socket_io->callback_context, send_result); } free(pending_socket_io->bytes); free(pending_socket_io); if (list_remove(socket_io_instance->pending_io_list, first_pending_io) != 0) { socket_io_instance->io_state = IO_STATE_ERROR; indicate_error(socket_io_instance); } } first_pending_io = list_get_head_item(socket_io_instance->pending_io_list); } while (received > 0) { unsigned char recv_bytes[1]; received = recv(socket_io_instance->socket, recv_bytes, sizeof(recv_bytes), 0); if (received > 0) { int i; for (i = 0; i < received; i++) { LOG(socket_io_instance->logger_log, 0, "<-%02x ", (unsigned char)recv_bytes[i]); } if (socket_io_instance->on_bytes_received != NULL) { /* explictly ignoring here the result of the callback */ (void)socket_io_instance->on_bytes_received(socket_io_instance->open_callback_context, recv_bytes, received); } } } } } }
void socketio_dowork(CONCRETE_IO_HANDLE socket_io) { if (socket_io != NULL) { SOCKET_IO_INSTANCE* socket_io_instance = (SOCKET_IO_INSTANCE*)socket_io; if (socket_io_instance->io_state == IO_STATE_OPEN) { int received = 1; LIST_ITEM_HANDLE first_pending_io = list_get_head_item(socket_io_instance->pending_io_list); while (first_pending_io != NULL) { PENDING_SOCKET_IO* pending_socket_io = (PENDING_SOCKET_IO*)list_item_get_value(first_pending_io); if (pending_socket_io == NULL) { socket_io_instance->io_state = IO_STATE_ERROR; indicate_error(socket_io_instance); break; } int send_result = tcpsocketconnection_send(socket_io_instance->tcp_socket_connection, (const char*)pending_socket_io->bytes, pending_socket_io->size); if (send_result != pending_socket_io->size) { if (send_result < 0) { if (send_result < UNABLE_TO_COMPLETE) { // Bad error. Indicate as much. socket_io_instance->io_state = IO_STATE_ERROR; indicate_error(socket_io_instance); } break; } else { /* send something, wait for the rest */ (void)memmove(pending_socket_io->bytes, pending_socket_io->bytes + send_result, pending_socket_io->size - send_result); } } else { if (pending_socket_io->on_send_complete != NULL) { pending_socket_io->on_send_complete(pending_socket_io->callback_context, IO_SEND_OK); } free(pending_socket_io->bytes); free(pending_socket_io); if (list_remove(socket_io_instance->pending_io_list, first_pending_io) != 0) { socket_io_instance->io_state = IO_STATE_ERROR; indicate_error(socket_io_instance); } } first_pending_io = list_get_head_item(socket_io_instance->pending_io_list); } while (received > 0) { unsigned char recv_bytes[128]; received = tcpsocketconnection_receive(socket_io_instance->tcp_socket_connection, (char*)recv_bytes, sizeof(recv_bytes)); if (received > 0) { if (socket_io_instance->on_bytes_received != NULL) { /* explictly ignoring here the result of the callback */ (void)socket_io_instance->on_bytes_received(socket_io_instance->on_bytes_received_context, recv_bytes, received); } } } } } }