+void gras_trp_sg_socket_client(gras_trp_plugin_t self,
+ /* OUT */ gras_socket_t sock) {
+
+ smx_host_t peer;
+ gras_trp_sg_sock_data_t *data;
+ gras_trp_procdata_t pd= (gras_trp_procdata_t) gras_libdata_by_id(gras_trp_libdata_id);
+
+
+ if (!(peer = SIMIX_host_get_by_name(sock->peer_name)))
+ THROW1(mismatch_error, 0,
+ "Can't connect to %s: no such host", sock->peer_name);
+
+ /* make sure this socket will reach someone */
+ xbt_dict_t all_sockets = ((gras_trp_sg_plug_data_t)self->data)->sockets;
+ char *sock_name=bprintf("%s:%d",sock->peer_name,sock->peer_port);
+ gras_socket_t server = xbt_dict_get_or_null(all_sockets,sock_name);
+ free(sock_name);
+
+ if (!server)
+ THROW2(mismatch_error, 0,
+ "can't connect to %s:%d, no process listen on this port",
+ sock->peer_name, sock->peer_port);
+
+ if (server->meas && !sock->meas) {
+ THROW2(mismatch_error, 0,
+ "can't connect to %s:%d in regular mode, the process listen "
+ "in measurement mode on this port", sock->peer_name,
+ sock->peer_port);
+ }
+ if (!server->meas && sock->meas) {
+ THROW2(mismatch_error, 0,
+ "can't connect to %s:%d in measurement mode, the process listen "
+ "in regular mode on this port", sock->peer_name, sock->peer_port);
+ }
+ /* create the socket */
+ data = xbt_new0(gras_trp_sg_sock_data_t, 1);
+ data->rdv = ((gras_trp_sg_sock_data_t *)server->data)->rdv;
+ data->from_process = SIMIX_process_self();
+
+ sock->data = data;
+ sock->incoming = 1;
+
+ /* Create a smx comm object about this socket */
+ data->ongoing_msg_size = sizeof(s_gras_msg_t);
+ smx_comm_t comm = SIMIX_network_irecv(data->rdv,&(data->ongoing_msg),&(data->ongoing_msg_size));
+ xbt_dynar_push(pd->comms,&comm);
+
+ DEBUG5("%s (PID %d) connects in %s mode to %s:%d",
+ SIMIX_process_get_name(SIMIX_process_self()), gras_os_getpid(),
+ sock->meas ? "meas" : "regular", sock->peer_name, sock->peer_port);