From: mquinson Date: Fri, 2 Jun 2006 00:16:08 +0000 (+0000) Subject: Two new functions (gras_socket_server_range and gras_socket_client_from_string),... X-Git-Tag: v3.3~3009 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/39e73f834dcaf61f33062f71db832981370d6222 Two new functions (gras_socket_server_range and gras_socket_client_from_string), plus let the SG selected sockets give a sensible value to peer_port (it worked on RL, make it more general) git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@2349 48e7efb5-ca39-0410-a469-dd3cf9ba447f --- diff --git a/src/gras/Transport/sg_transport.c b/src/gras/Transport/sg_transport.c index 3295dd1876..99171e95b6 100644 --- a/src/gras/Transport/sg_transport.c +++ b/src/gras/Transport/sg_transport.c @@ -81,7 +81,7 @@ gras_socket_t gras_trp_select(double timeout) { res->accepting = 0; res->sd = -1; - res->port = -1; + res->port = -1; sockdata = xbt_new(gras_trp_sg_sock_data_t,1); sockdata->from_PID = MSG_process_self_PID(); @@ -89,7 +89,7 @@ gras_socket_t gras_trp_select(double timeout) { sockdata->to_host = MSG_process_get_host(MSG_process_from_PID(r_pid)); res->data = sockdata; gras_trp_buf_init_sock(res); - + res->peer_name = strdup(MSG_host_get_name(sockdata->to_host)); remote_hd=(gras_hostdata_t *)MSG_host_get_data(sockdata->to_host); @@ -127,6 +127,7 @@ gras_socket_t gras_trp_select(double timeout) { } } } + res->peer_port = ((gras_trp_procdata_t) gras_libdata_by_name_from_remote("gras_trp",MSG_process_from_PID(r_pid)))->myport; xbt_assert0(sockdata->to_chan != -1, "Got a message from a process without channel"); diff --git a/src/gras/Transport/transport.c b/src/gras/Transport/transport.c index 69ff90e90f..83a2175020 100644 --- a/src/gras/Transport/transport.c +++ b/src/gras/Transport/transport.c @@ -8,6 +8,7 @@ * under the terms of the license (GNU LGPL) which comes with this package. */ #include "xbt/ex.h" +#include "xbt/host.h" #include "portable.h" #include "gras/Transport/transport_private.h" @@ -173,8 +174,7 @@ void gras_trp_socket_new(int incoming, gras_libdata_by_id(gras_trp_libdata_id))->sockets,dst); XBT_OUT; } - - + /** * @brief Opens a server socket and makes it ready to be listened to. * @param port: port on which you want to listen @@ -225,8 +225,39 @@ gras_socket_server_ext(unsigned short port, RETHROW; } + ((gras_trp_procdata_t) gras_libdata_by_id(gras_trp_libdata_id))->myport = port; return sock; } +/** + * @brief Opens a server socket on any port in the given range + * + * @param minport: first port we will try + * @param maxport: last port we will try + * @param buf_size: size of the buffer (in byte) on the socket (for TCP sockets only). If 0, a sain default is used (32k, but may change) + * @param measurement: whether this socket is meant to convey measurement (if you don't know, use 0 to exchange regular messages) + * + * If none of the provided ports works, raises the exception got when trying the last possibility + */ +gras_socket_t +gras_socket_server_range(unsigned short minport, unsigned short maxport, + unsigned long int buf_size, int measurement) { + + int port; + gras_socket_t res=NULL; + xbt_ex_t e; + + for (port=minport; port:' */ +gras_socket_t +gras_socket_client_from_string(const char *host) { + xbt_host_t h = xbt_host_from_string(host); + gras_socket_t res = gras_socket_client_ext(h->name,h->port,0,0); + xbt_host_free(h); + return res; +} +/** \brief Close socket */ void gras_socket_close(gras_socket_t sock) { xbt_dynar_t sockets = ((gras_trp_procdata_t) gras_libdata_by_id(gras_trp_libdata_id))->sockets; gras_socket_t sock_iter; @@ -508,6 +543,7 @@ static void *gras_trp_procdata_new() { res->name = xbt_strdup("gras_trp"); res->name_len = 0; res->sockets = xbt_dynar_new(sizeof(gras_socket_t*), NULL); + res->myport = 0; return (void*)res; } diff --git a/src/gras/Transport/transport_interface.h b/src/gras/Transport/transport_interface.h index 202c9dafd6..0cad5611a3 100644 --- a/src/gras/Transport/transport_interface.h +++ b/src/gras/Transport/transport_interface.h @@ -93,6 +93,7 @@ typedef struct { unsigned int name_len; xbt_dynar_t sockets; /* all sockets known to this process */ + int myport; /* Port on which I listen myself */ fd_set *fdset; /* SG only elements. In RL, they are part of the OS ;) */ diff --git a/src/gras/Transport/transport_plugin_tcp.c b/src/gras/Transport/transport_plugin_tcp.c index ef3f63a222..a4db1b640a 100644 --- a/src/gras/Transport/transport_plugin_tcp.c +++ b/src/gras/Transport/transport_plugin_tcp.c @@ -30,7 +30,6 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(gras_trp_tcp,gras_trp, "TCP buffered transport"); -int _gras_master_socket_port = -1; /*** *** Specific socket part ***/ @@ -79,7 +78,7 @@ static inline void gras_trp_sock_socket_client(gras_trp_plugin_t ignored, struct hostent *he; struct in_addr *haddr; int size = sock->buf_size; - uint32_t myport = htonl(_gras_master_socket_port); + uint32_t myport = htonl(((gras_trp_procdata_t) gras_libdata_by_id(gras_trp_libdata_id))->myport); sock->incoming = 1; /* TCP sockets are duplex'ed */ @@ -134,7 +133,6 @@ static inline void gras_trp_sock_socket_server(gras_trp_plugin_t ignored, sock->outgoing = 1; /* TCP => duplex mode */ - _gras_master_socket_port = sock->port; server.sin_port = htons((u_short)sock->port); server.sin_addr.s_addr = INADDR_ANY; server.sin_family = AF_INET; @@ -286,6 +284,13 @@ static inline void gras_trp_tcp_send(gras_socket_t sock, DEBUG3("write(%d, %p, %ld);", sock->sd, data, size); if (status < 0) { +#ifdef EWOULDBLOCK + if (errno == EINTR || errno == EAGAIN || errno == EWOULDBLOCK) +#else + if (errno == EINTR || errno == EAGAIN) +#endif + continue; + THROW4(system_error,0,"write(%d,%p,%ld) failed: %s", sock->sd, data, size, sock_errstr);