Update of /cvsroot/playerstage/code/player/client_libs/libplayerc
In directory
sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv2848/client_libs/libplayerc
Modified Files:
client.c playerc.h
Log Message:
added reconnect logic to libplayerc, and appropriate methods to libplayerc++
Index: client.c
===================================================================
RCS file: /cvsroot/playerstage/code/player/client_libs/libplayerc/client.c,v
retrieving revision 1.70
retrieving revision 1.71
diff -C2 -d -r1.70 -r1.71
*** client.c 6 Sep 2006 15:15:38 -0000 1.70
--- client.c 13 Sep 2006 18:40:16 -0000 1.71
***************
*** 72,75 ****
--- 72,76 ----
// Player message structure for subscibing to devices. This one is
// easier to use than the one defined in messages.h.
+ /*
typedef struct
{
***************
*** 79,82 ****
--- 80,84 ----
uint8_t access;
} __attribute__ ((packed)) playerc_msg_subscribe_t;
+ */
***************
*** 162,165 ****
--- 164,170 ----
client->request_timeout = 5.0;
+ client->retry_limit = 0;
+ client->retry_time = 2.0;
+
return client;
}
***************
*** 304,307 ****
--- 309,375 ----
}
+ // Disconnect from the server, with potential retry
+ int playerc_client_disconnect_retry(playerc_client_t *client)
+ {
+ int retval;
+ int i;
+ int j;
+
+ /* Disconnect */
+ if((retval = playerc_client_disconnect(client)) != 0)
+ PLAYER_WARN("playerc_client_disconnect() failed");
+
+ for(j=0; (client->retry_limit < 0) || (j<client->retry_limit); j++)
+ {
+ PLAYER_WARN1("Reconnecting, attempt %d", j);
+ /* Reconnect */
+ if((retval = playerc_client_connect(client)) != 0)
+ PLAYER_WARN("playerc_client_connect() failed");
+ else
+ {
+ /* Clean out buffers */
+ client->read_xdrdata_len = 0;
+
+ /* TODO: re-establish replacement rules, delivery modes, etc. */
+
+ /* Re-subscribe to devices */
+ for(i=0;i<client->device_count;i++)
+ {
+ if(client->device[i]->subscribed)
+ {
+ // TODO: what should access be here?
+ if((retval = playerc_device_subscribe(client->device[i],
+ PLAYERC_OPEN_MODE)) != 0)
+ {
+ PLAYER_WARN2("playerc_device_subscribe() failed for %d:%d",
+ client->device[i]->addr.interf,
+ client->device[i]->addr.index);
+
+ // TODO: Subscription failed for one device; should we give up?
+ if(playerc_client_disconnect(client) != 0)
+ PLAYER_WARN("playerc_client_disconnect() failed");
+ break;
+ }
+ }
+ }
+ // Did we get all of them?
+ if(i == client->device_count)
+ break;
+ }
+
+ usleep((uint)rint(client->retry_time * 1e6));
+ }
+
+ if((client->retry_limit < 0) || (j < client->retry_limit))
+ {
+ PLAYER_WARN("successfully reconnected");
+ return(0);
+ }
+ else
+ {
+ PLAYER_WARN("failed to reconnect");
+ return(-1);
+ }
+ }
// Disconnect from the server
***************
*** 789,793 ****
PLAYERC_ERR1("recv failed with error [%s]", strerror(errno));
//playerc_client_disconnect(client);
! return -1;
}
client->read_xdrdata_len += nbytes;
--- 857,862 ----
PLAYERC_ERR1("recv failed with error [%s]", strerror(errno));
//playerc_client_disconnect(client);
! if(playerc_client_disconnect_retry(client) != 0)
! return -1;
}
client->read_xdrdata_len += nbytes;
***************
*** 1034,1035 ****
--- 1103,1115 ----
}
+ // Set the retry limit
+ void playerc_client_set_retry_limit(playerc_client_t* client, int limit)
+ {
+ client->retry_limit = limit;
+ }
+
+ // Set the retry time
+ void playerc_client_set_retry_time(playerc_client_t* client, double time)
+ {
+ client->retry_time = time;
+ }
Index: playerc.h
===================================================================
RCS file: /cvsroot/playerstage/code/player/client_libs/libplayerc/playerc.h,v
retrieving revision 1.207
retrieving revision 1.208
diff -C2 -d -r1.207 -r1.208
*** playerc.h 11 Sep 2006 19:57:37 -0000 1.207
--- playerc.h 13 Sep 2006 18:40:16 -0000 1.208
***************
*** 453,456 ****
--- 453,465 ----
struct sockaddr_in server;
+ /** How many times we'll try to reconnect after a socket error. Use @ref
+ * playerc_client_set_retry_limit() to set this value. Set to -1 for
+ * infinite retry. */
+ int retry_limit;
+
+ /** How long to sleep, in seconds, to sleep between reconnect attempts.
+ * Use @ref playerc_client_set_retry_time() to set this value. */
+ double retry_time;
+
/** @internal Socket descriptor */
int sock;
***************
*** 541,544 ****
--- 550,561 ----
int playerc_client_disconnect(playerc_client_t *client);
+ /** @brief Disconnect from the server, with potential retry. @internal
+
+ @param client Pointer to client object.
+
+ @returns Returns 0 on success, non-zero otherwise.
+ */
+ int playerc_client_disconnect_retry(playerc_client_t *client);
+
/** @brief Change the server's data delivery mode.
***************
*** 691,694 ****
--- 708,726 ----
void playerc_client_set_request_timeout(playerc_client_t* client, uint
seconds);
+ /** @brief Set the connection retry limit.
+
+ @param client Pointer to the client object
+ @param limit The number of times to attempt to reconnect to the server. Give
-1 for
+ infinite retry.
+ */
+ void playerc_client_set_retry_limit(playerc_client_t* client, int limit);
+
+ /** @brief Set the connection retry sleep time.
+
+ @param client Pointer to the client object
+ @param time The amount of time, in seconds, to sleep between reconnection
attempts.
+ */
+ void playerc_client_set_retry_time(playerc_client_t* client, double time);
+
/** @brief Write data to the server. @internal
*/
-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
Playerstage-commit mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/playerstage-commit