+void gras_trp_sg_socket_client(gras_trp_plugin_t self,
+ /* OUT */ gras_socket_t sock){
+ xbt_ex_t e;
+
+ m_host_t peer;
+ gras_hostdata_t *hd;
+ gras_trp_sg_sock_data_t *data;
+ gras_sg_portrec_t pr;
+
+ /* make sure this socket will reach someone */
+ if (!(peer=MSG_get_host_by_name(sock->peer_name)))
+ THROW1(mismatch_error,0,"Can't connect to %s: no such host.\n",sock->peer_name);
+
+ if (!(hd=(gras_hostdata_t *)MSG_host_get_data(peer)))
+ THROW1(mismatch_error,0,
+ "can't connect to %s: no process on this host",
+ sock->peer_name);
+
+ TRY {
+ find_port(hd,sock->peer_port,&pr);
+ } CATCH(e) {
+ if (e.category == mismatch_error) {
+ xbt_ex_free(e);
+ THROW2(mismatch_error,0,
+ "can't connect to %s:%d, no process listen on this port",
+ sock->peer_name,sock->peer_port);
+ }
+ RETHROW;
+ }
+
+ if (pr.meas && !sock->meas) {
+ THROW2(mismatch_error,0,
+ "can't connect to %s:%d in regular mode, the process listen "
+ "in meas mode on this port",sock->peer_name,sock->peer_port);
+ }
+ if (!pr.meas && sock->meas) {
+ THROW2(mismatch_error,0,
+ "can't connect to %s:%d in meas mode, the process listen "
+ "in regular mode on this port",sock->peer_name,sock->peer_port);
+ }
+
+ /* create the socket */
+ data = xbt_new(gras_trp_sg_sock_data_t,1);
+ data->from_PID = MSG_process_self_PID();
+ data->to_PID = hd->proc[ pr.tochan ];
+ data->to_host = peer;
+ data->to_chan = pr.tochan;
+
+ sock->data = data;
+ sock->incoming = 1;
+
+ DEBUG6("%s (PID %d) connects in %s mode to %s:%d (to_PID=%d)",
+ MSG_process_get_name(MSG_process_self()), MSG_process_self_PID(),
+ sock->meas?"meas":"regular",
+ sock->peer_name,sock->peer_port,data->to_PID);