static gssize g_socket_output_stream_pollable_write_nonblocking (GPollableOutputStream *pollable, const void *buffer, gsize size, GError **error) { GSocketOutputStream *output_stream = G_SOCKET_OUTPUT_STREAM (pollable); return g_socket_send_with_blocking (output_stream->priv->socket, buffer, size, FALSE, NULL, error); }
static gssize g_socket_output_stream_write (GOutputStream *stream, const void *buffer, gsize count, GCancellable *cancellable, GError **error) { GSocketOutputStream *onput_stream = G_SOCKET_OUTPUT_STREAM (stream); return g_socket_send_with_blocking (onput_stream->priv->socket, buffer, count, TRUE, cancellable, error); }
static char *_s52_send_cmd(const char *command, const char *params) { // debug //g_print("s52ais:_s52_send_cmd(): start:%s\n", params); if (NULL == _s52_connection) { g_print("s52ais:_s52_send_cmd(): fail - no conection\n"); return NULL; } GSocket *socket = g_socket_connection_get_socket(_s52_connection); if (NULL == socket) { g_print("s52ais:_s52_send_cmd(): fail - no socket\n"); return NULL; } GError *error = NULL; guint n = 0; // build a full JSON object n = g_snprintf(_response, BUFSZ, "{\"id\":%i,\"method\":\"%s\",\"params\":[%s]}\n", _request_id++, command, params); if (n > BUFSZ) { g_print("s52ais:_s52_send_cmd():g_snprintf(): no space in buffer\n"); return NULL; } _response[n] = '\0'; //g_print("s52ais:_s52_send_cmd(): sending:%s", _response); gssize szsnd = g_socket_send_with_blocking(socket, _response, n, FALSE, NULL, &error); if ((NULL!=error) || (0==szsnd) || (-1==szsnd)) { // 0 - connection was closed by the peer // -1 - on error if (NULL == error) g_print("s52ais:_s52_send_cmd():ERROR:g_socket_send_with_blocking(): connection close [%s]\n", _response); else g_print("s52ais:_s52_send_cmd():ERROR:g_socket_send_with_blocking(): %s [%i:%s]\n", error->message, error->code, _response); _s52_connection = NULL; // reset connection return NULL; } //g_print("s52ais:_s52_send_cmd(): sended:%s", _response); // wait response - blocking socket int szrcv = g_socket_receive_with_blocking(socket, _response, BUFSZ, TRUE, NULL, &error); //gssize szrcv = g_socket_receive_with_blocking(socket, _response, BUFSZ, FALSE, NULL, &error); //if ((NULL!=error) || (0==szrcv) || (-1==szrcv)) { if (NULL != error) { g_print("s52ais:_s52_send_cmd():ERROR:g_socket_receive_with_blocking(): %s [%i:%s]\n", error->message, error->code, _response); _s52_connection = NULL; // reset connection return NULL; } if ((0==szrcv) || (-1==szrcv)) { // 0 - connection was closed by the peer // -1 - on error g_print("s52ais:_s52_send_cmd():ERROR:g_socket_receive_with_blocking(): szrcv:%i\n", szrcv); _s52_connection = NULL; // reset connection return NULL; } _response[szrcv] = '\0'; //g_print("s52ais:_s52_send_cmd(): received:%s\n", _response); gchar *result = g_strrstr(_response, "result"); if (NULL == result) { g_print("s52ais:_s52_send_cmd():no result [_response:'%s']\n", _response); return NULL; } return _response; }