コード例 #1
0
void           remote_client_connect          (RemoteClient*         self)
{
    /* Clean up after the previous connection, if we need to */
    if (self->gconn) {
	gnet_conn_delete(self->gconn);
	self->gconn = NULL;
    }
    remote_client_empty_queue(self);

    /* Reset our speed counters and rate limiting timers */
    self->iter_accumulator = 0;
    self->byte_accumulator = 0;
    self->iters_per_sec = 0;
    self->bytes_per_sec = 0;
    g_timer_start(self->stream_request_timer);
    g_timer_start(self->status_speed_timer);
    g_timer_start(self->stream_speed_timer);

    /* Create the new connection object */
    self->gconn = gnet_conn_new(self->host, self->port, remote_client_callback, self);
    gnet_conn_set_watch_error(self->gconn, TRUE);
    gnet_conn_connect(self->gconn);
    gnet_conn_readline(self->gconn);

    remote_client_update_status(self, "Connecting...");
}
コード例 #2
0
ファイル: echoserver-partyline.c プロジェクト: GNOME/gnet
static void
ob_client_func (GConn* conn, GConnEvent* event, gpointer user_data)
{
  gchar* buf2;
  switch (event->type)
    {
    case GNET_CONN_READ:
      {
		event->buffer[event->length-1] = '\n';
		buf2= g_memdup (event->buffer, event->length+1);
		buf2[event->length]='\0';
		g_list_foreach(connection_list,send_to,buf2);

		gnet_conn_readline (conn);
		break;
      }
    case GNET_CONN_WRITE:
      {
	; /* Do nothing */
	break;
      }

    case GNET_CONN_CLOSE:
    case GNET_CONN_TIMEOUT:
    case GNET_CONN_ERROR:
      {
		connection_list = g_list_remove(connection_list, conn );
		gnet_conn_delete (conn);
	break;
      }
    default:
      g_assert_not_reached ();
    }
}
コード例 #3
0
ファイル: echoserver-gserver.c プロジェクト: GNOME/gnet
static void
ob_client_func (GConn* conn, GConnEvent* event, gpointer user_data)
{
  switch (event->type)
    {
    case GNET_CONN_READ:
      {
	event->buffer[event->length-1] = '\n';
	gnet_conn_write (conn, event->buffer, event->length);

/*  	fwrite (event->buffer, event->length, 1, stdout); */

	gnet_conn_readline (conn);
	break;
      }

    case GNET_CONN_WRITE:
      {
	; /* Do nothing */
	break;
      }

    case GNET_CONN_CLOSE:
    case GNET_CONN_TIMEOUT:
    case GNET_CONN_ERROR:
      {
	gnet_conn_delete (conn);
	break;
      }

    default:
      g_assert_not_reached ();
    }
}
コード例 #4
0
static void       remote_client_recv_line     (RemoteClient*         self,
					       GConnEvent*           event)
{
    RemoteResponse *response = g_new0(RemoteResponse, 1);
    RemoteClosure *closure;

    response->code = strtol(event->buffer, &response->message, 10);
    if (*response->message)
	response->message++;
    response->message = g_strdup(response->message);

    if (response->code == FYRE_RESPONSE_BINARY) {
	/* Extract the length of the binary response, then start
	 * reading the binary data itself. Note that if we
	 * have a zero-length binary message, skip the next
	 * stage and fall through to processing a normal message.
	 */
	response->data_length = strtol(response->message, NULL, 10);

	if (response->data_length > 0) {
	    self->current_binary_response = response;
	    gnet_conn_readn(self->gconn, response->data_length);
	    return;
	}
    }

    /* We're done, signal the callback and start waiting
     * for another normal response line.
     */
    closure = g_queue_pop_tail(self->response_queue);

    if (closure) {
	/* This was an answer to some request. Invoke the callback
	 * if one was specified.
	 */
	if (closure->callback)
	    closure->callback(self, response, closure->user_data);
	g_free(closure);
    }
    else {
	/* This was unsolicited- should only occur for the server ready message */
	if (response->code == FYRE_RESPONSE_READY) {
	    self->is_ready = TRUE;
	    remote_client_update_status(self, "Ready");
	}
	else {
	    remote_client_update_status(self, "Protocol error");
	}
    }

    g_free(response->message);
    g_free(response);

    gnet_conn_readline(self->gconn);
}
コード例 #5
0
ファイル: echoserver-gserver.c プロジェクト: GNOME/gnet
static void
ob_server_func (GServer* server, GConn* conn, gpointer user_data)
{
  if (conn)
    {
      gnet_conn_set_callback (conn, ob_client_func, NULL);
      gnet_conn_set_watch_error (conn, TRUE);
      gnet_conn_readline (conn);
    }
  else	/* Error */
    {
      gnet_server_delete (server);
      exit (EXIT_FAILURE);
    }
}
コード例 #6
0
static void       remote_client_recv_binary   (RemoteClient*         self,
					       GConnEvent*           event)
{
    RemoteClosure* closure = g_queue_pop_tail(self->response_queue);
    RemoteResponse* response = self->current_binary_response;
    self->current_binary_response = NULL;

    g_assert(closure != NULL);

    response->data = event->buffer;
    if (closure->callback)
	closure->callback(self, response, closure->user_data);

    g_free(closure);
    g_free(response->message);
    g_free(response);

    gnet_conn_readline(self->gconn);
}
コード例 #7
0
ファイル: remote-server.c プロジェクト: ain101/Fyre
static void       remote_server_connect       (GServer*              gserver,
					       GConn*                gconn,
					       gpointer              user_data)
{
    RemoteServerConn* self = g_new0(RemoteServerConn, 1);

    self->server = (RemoteServer*) user_data;
    self->gconn = gconn;
    self->map = ITERATIVE_MAP(de_jong_new());

    gnet_conn_set_callback(gconn, remote_server_callback, self);
    gnet_conn_set_watch_error(gconn, TRUE);
    gnet_conn_readline(gconn);

    remote_server_send_response(self, FYRE_RESPONSE_READY,
				"Fyre rendering server ready");

    if (self->server->verbose)
	printf("[%s:%d] Connected\n", gconn->hostname, gconn->port);
}
コード例 #8
0
ファイル: remote-server.c プロジェクト: ain101/Fyre
static void       remote_server_callback      (GConn*                gconn,
					       GConnEvent*           event,
					       gpointer              user_data)
{
    RemoteServerConn* self = (RemoteServerConn*) user_data;

    switch (event->type) {

    case GNET_CONN_READ:
	remote_server_dispatch_line(self, event->buffer);
	gnet_conn_readline(gconn);
	break;

    case GNET_CONN_CLOSE:
    case GNET_CONN_TIMEOUT:
    case GNET_CONN_ERROR:
	remote_server_disconnect(self);
	break;

    default:
	break;
    }
}
コード例 #9
0
ファイル: run.c プロジェクト: BackupTheBerlios/upwatch-svn
static void ob_server_func (GServer* server, GServerStatus status, struct _GConn* conn, gpointer user_data)
{
  switch (status)
    {
    case GNET_SERVER_STATUS_CONNECT:
      {
        if (debug) {
          LOG(LOG_DEBUG, "New connection from %s", gnet_inetaddr_get_canonical_name(conn->inetaddr));
        }
        conn->func = ob_client_func;
        conn->user_data = calloc(1, sizeof(struct conn_stat));
        gnet_conn_write (conn, strdup(hello), strlen(hello), 0);
        gnet_conn_readline (conn, NULL, 1024, 30000);
        break;
      }

    case GNET_SERVER_STATUS_ERROR:
      {
        gnet_server_delete (server);
        exit (1);
        break;
      }
    }
}
コード例 #10
0
ファイル: echoclient-gconn.c プロジェクト: GNOME/gnet
/* Handle GConn events */
static void
ob_conn_func (GConn* conn, GConnEvent* event, gpointer user_data)
{
  switch (event->type)
    {
    case GNET_CONN_CONNECT:
      {
	gnet_conn_timeout (conn, 0);	/* reset timeout */
	gnet_conn_readline (conn);
	break;
      }

    case GNET_CONN_READ:
      {
	/* Write line out */
	event->buffer[event->length - 1] = '\n';
        if (fwrite (event->buffer, event->length, 1, stdout) != 1) {
         fprintf (stderr, "Error: fwrite to stdout failed: %s\n", g_strerror (errno));
        }

	/* Check if done */
	lines_pending--;
	if (lines_pending == 0 && read_eof)
	  exit (EXIT_SUCCESS);

	/* Read another line */
	gnet_conn_readline (conn);

	break;
      }

    case GNET_CONN_WRITE:
      {
	; /* do nothing */
	break;
      }

    case GNET_CONN_CLOSE:
      {
	gnet_conn_delete (conn);
	exit (EXIT_SUCCESS);
	break;
      }

    case GNET_CONN_TIMEOUT:
      {
	gnet_conn_delete (conn);
	fprintf (stderr, "Connection timeout\n");
	exit (EXIT_FAILURE);
	break;
      }

    case GNET_CONN_ERROR:
      {
	gnet_conn_delete (conn);
	fprintf (stderr, "Connection failure\n");
	exit (EXIT_FAILURE);
	break;
      }

    default:
      g_assert_not_reached ();
    }
}