int VMDCollab::startserver(int port) { if (serversock) { msgErr << "Already running a server on port " << port << sendmsg; return FALSE; } void *serversock = vmdsock_create(); if (!serversock) { msgErr << "Could not create socket." << sendmsg; return FALSE; } if (vmdsock_bind(serversock, port)) { msgErr << "Could not bind vmdcollab server to port " << port << sendmsg; vmdsock_destroy(serversock); return FALSE; } vmdsock_listen(serversock); wkf_thread_t serverthread; if (wkf_thread_create(&serverthread, serverproc, // my thread routine serversock // context for thread )) { msgErr << "VMDCollab: unable to create server thread" << sendmsg; } else { msgInfo << "Starting VMDCollab bounce server." << sendmsg; } return TRUE; }
IMD::IMD(const ActionOptions& ao): Action(ao), ActionAtomistic(ao), ActionPilot(ao), host("localhost"), port(0), wait(false), wrap(false), sock(NULL), clientsock(NULL), connected(false), transferRate(100), fscale(1.0) { natoms=plumed.getAtoms().getNatoms(); std::vector<AtomNumber> index(natoms); for(int i=0;i<natoms;i++) index[i].setIndex(i); requestAtoms(index); coord.resize(natoms*3,float(0.0)); forces.resize(natoms*3,0.0); parseFlag("WAIT",wait); bool nowait=false; parseFlag("NOWAIT",nowait); if(nowait)wait=false; parseFlag("WRAP",wrap); parse("PORT",port); parse("HOST",host); parse("FSCALE",fscale); checkRead(); log.printf(" with host %s\n",host.c_str()); log.printf(" with port %d\n",port); if(wait) log.printf(" waiting for a connection\n"); else log.printf(" not waiting for a connection\n"); if(wrap) log.printf(" wrapping atoms\n"); else log.printf(" not wrapping atoms\n"); log.printf(" WMD forces will be scaled by %f\n",fscale); if(comm.Get_rank()==0){ vmdsock_init(); sock = vmdsock_create(); vmdsock_bind(sock, port); vmdsock_listen(sock); } connect(); }
int tclcommand_imd(ClientData data, Tcl_Interp *interp, int argc, char **argv) { if (argc < 2) { Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " connect|disconnect|listen|positions|energies ?values?\"", (char *) NULL); return (TCL_ERROR); } if (ARG1_IS_S("connect")) { /* connect to vmd */ int port = 12346; if (argc > 3) { Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " connect ?port?\"", (char *) NULL); return (TCL_ERROR); } if (argc == 3) if (!ARG_IS_I(2, port)) return (TCL_ERROR); if (sock) vmdsock_destroy(sock); if (initsock) vmdsock_destroy(initsock); sock = 0; initsock = 0; vmdsock_init(); initsock = vmdsock_create(); if (vmdsock_bind(initsock, port) != 0) { Tcl_AppendResult(interp, "IMD bind failed. Port already in use ?", (char *) NULL); vmdsock_destroy(initsock); initsock = 0; return (TCL_ERROR); } if (vmdsock_listen(initsock)) { Tcl_AppendResult(interp, "IMD listen failed. Port already in use ?", (char *) NULL); vmdsock_destroy(initsock); initsock = 0; return (TCL_ERROR); } return (TCL_OK); } if (ARG1_IS_S("disconnect")) { if (argc > 2) { Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " disconnect\"", (char *) NULL); return (TCL_ERROR); } if (sock) vmdsock_destroy(sock); if (initsock) vmdsock_destroy(initsock); sock = 0; initsock = 0; Tcl_AppendResult(interp, "no connection", (char *) NULL); return (TCL_OK); } if (ARG1_IS_S("listen")) { /* wait until vmd connects */ int cnt = 3600; if (argc != 3) { Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " listen <secs>\"", (char *) NULL); return (TCL_ERROR); } if (!ARG_IS_I(2, cnt)) return (TCL_ERROR); while (initsock && !sock && cnt--) { if (tclcommand_imd_print_check_connect(interp) == TCL_ERROR) return (TCL_ERROR); sleep(1); } if (!sock) Tcl_AppendResult(interp, "no connection", (char *) NULL); else { if (tclcommand_imd_print_drain_socket(interp) == TCL_ERROR) return (TCL_ERROR); Tcl_AppendResult(interp, "connected", (char *) NULL); } return (TCL_OK); } if (ARG1_IS_S("positions")) return tclcommand_imd_parse_pos(interp, argc, argv); if (ARG1_IS_S("energies")) { Tcl_AppendResult(interp, "Sorry. imd energies not yet implemented", (char *) NULL); return (TCL_ERROR); } Tcl_AppendResult(interp, "imd: unkown job.", (char *) NULL); return (TCL_ERROR); }