int socketio_send(CONCRETE_IO_HANDLE socket_io, const void* buffer, size_t size, ON_SEND_COMPLETE on_send_complete, void* callback_context) { int result; if ((socket_io == NULL) || (buffer == NULL) || (size == 0)) { /* Invalid arguments */ LogError("Invalid argument: send given invalid parameter"); result = __LINE__; } else { SOCKET_IO_INSTANCE* socket_io_instance = (SOCKET_IO_INSTANCE*)socket_io; if (socket_io_instance->io_state != IO_STATE_OPEN) { LogError("Failure: socket state is not opened."); result = __LINE__; } else { LIST_ITEM_HANDLE first_pending_io = singlylinkedlist_get_head_item(socket_io_instance->pending_io_list); if (first_pending_io != NULL) { if (add_pending_io(socket_io_instance, buffer, size, on_send_complete, callback_context) != 0) { LogError("Failure: add_pending_io failed."); result = __LINE__; } else { result = 0; } } else { /* TODO: we need to do more than a cast here to be 100% clean The following bug was filed: [WarnL4] socketio_win32 does not account for already sent bytes and there is a truncation of size from size_t to int */ int send_result = send(socket_io_instance->socket, buffer, (int)size, 0); if (send_result != (int)size) { int last_error = WSAGetLastError(); if (last_error != WSAEWOULDBLOCK) { indicate_error(socket_io_instance); LogError("Failure: sending socket failed %d.", last_error); result = __LINE__; } else { /* queue data */ if (add_pending_io(socket_io_instance, buffer, size, on_send_complete, callback_context) != 0) { LogError("Failure: add_pending_io failed."); result = __LINE__; } else { result = 0; } } } else { if (on_send_complete != NULL) { on_send_complete(callback_context, IO_SEND_OK); } result = 0; } } } } return result; }
int socketio_send(CONCRETE_IO_HANDLE socket_io, const void* buffer, size_t size, ON_SEND_COMPLETE on_send_complete, void* callback_context) { int result; if ((socket_io == NULL) || (buffer == NULL) || (size == 0)) { /* Invalid arguments */ LogError("Invalid argument: send given invalid parameter"); result = __LINE__; } else { SOCKET_IO_INSTANCE* socket_io_instance = (SOCKET_IO_INSTANCE*)socket_io; if (socket_io_instance->io_state != IO_STATE_OPEN) { LogError("Failure: socket state is not opened."); result = __LINE__; } else { LIST_ITEM_HANDLE first_pending_io = list_get_head_item(socket_io_instance->pending_io_list); if (first_pending_io != NULL) { if (add_pending_io(socket_io_instance, buffer, size, on_send_complete, callback_context) != 0) { LogError("Failure: add_pending_io failed."); result = __LINE__; } else { result = 0; } } else { int send_result = send(socket_io_instance->socket, buffer, size, 0); if (send_result != size) { if (send_result == INVALID_SOCKET) { indicate_error(socket_io_instance); LogError("Failure: sending socket failed."); result = __LINE__; } else { /* queue data */ if (add_pending_io(socket_io_instance, buffer + send_result, size - send_result, on_send_complete, callback_context) != 0) { LogError("Failure: add_pending_io failed."); result = __LINE__; } else { result = 0; } } } else { if (on_send_complete != NULL) { on_send_complete(callback_context, IO_SEND_OK); } size_t i; for (i = 0; i < size; i++) { LOG(socket_io_instance->logger_log, 0, "%02x-> ", ((unsigned char*)buffer)[i]); } LOG(socket_io_instance->logger_log, LOG_LINE, ""); result = 0; } } } } return result; }
int socketio_send(CONCRETE_IO_HANDLE socket_io, const void* buffer, size_t size, ON_SEND_COMPLETE on_send_complete, void* callback_context) { int result; if ((socket_io == NULL) || (buffer == NULL) || (size == 0)) { /* Invalid arguments */ result = __LINE__; } else { SOCKET_IO_INSTANCE* socket_io_instance = (SOCKET_IO_INSTANCE*)socket_io; if (socket_io_instance->io_state != IO_STATE_OPEN) { result = __LINE__; } else { LIST_ITEM_HANDLE first_pending_io = list_get_head_item(socket_io_instance->pending_io_list); if (first_pending_io != NULL) { if (add_pending_io(socket_io_instance, buffer, size, on_send_complete, callback_context) != 0) { result = __LINE__; } else { result = 0; } } else { int send_result = tcpsocketconnection_send(socket_io_instance->tcp_socket_connection, buffer, size); if (send_result != size) { if (send_result < 0) { send_result = 0; } /* queue data */ if (add_pending_io(socket_io_instance, (unsigned char*)buffer + send_result, size - send_result, on_send_complete, callback_context) != 0) { result = __LINE__; } else { result = 0; } } else { if (on_send_complete != NULL) { on_send_complete(callback_context, IO_SEND_OK); } size_t i; for (i = 0; i < size; i++) { LOG(socket_io_instance->logger_log, 0, "%02x-> ", ((unsigned char*)buffer)[i]); } result = 0; } } } } return result; }