/*@C PetscViewerSocketOpen - Opens a connection to a Matlab or other socket based server. Collective on MPI_Comm Input Parameters: + comm - the MPI communicator . machine - the machine the server is running on,, use PETSC_NULL for the local machine, use "server" to passively wait for a connection from elsewhere - port - the port to connect to, use PETSC_DEFAULT for the default Output Parameter: . lab - a context to use when communicating with the server Level: intermediate Notes: Most users should employ the following commands to access the Matlab PetscViewers $ $ PetscViewerSocketOpen(MPI_Comm comm, char *machine,int port,PetscViewer &viewer) $ MatView(Mat matrix,PetscViewer viewer) $ $ or $ $ PetscViewerSocketOpen(MPI_Comm comm,char *machine,int port,PetscViewer &viewer) $ VecView(Vec vector,PetscViewer viewer) Options Database Keys: For use with PETSC_VIEWER_SOCKET_WORLD, PETSC_VIEWER_SOCKET_SELF, PETSC_VIEWER_SOCKET_() or if PETSC_NULL is passed for machine or PETSC_DEFAULT is passed for port $ -viewer_socket_machine <machine> $ -viewer_socket_port <port> Environmental variables: + PETSC_VIEWER_SOCKET_PORT portnumber - PETSC_VIEWER_SOCKET_MACHINE machine name Currently the only socket client available is Matlab. See src/dm/da/examples/tests/ex12.c and ex12.m for an example of usage. Notes: The socket viewer is in some sense a subclass of the binary viewer, to read and write to the socket use PetscViewerBinaryRead/Write/GetDescriptor(). Concepts: Matlab^sending data Concepts: sockets^sending data .seealso: MatView(), VecView(), PetscViewerDestroy(), PetscViewerCreate(), PetscViewerSetType(), PetscViewerSocketSetConnection(), PETSC_VIEWER_SOCKET_, PETSC_VIEWER_SOCKET_WORLD, PETSC_VIEWER_SOCKET_SELF, PetscViewerBinaryWrite(), PetscViewerBinaryRead(), PetscViewerBinaryWriteStringArray(), PetscBinaryViewerGetDescriptor() @*/ PetscErrorCode PETSC_DLLEXPORT PetscViewerSocketOpen(MPI_Comm comm,const char machine[],int port,PetscViewer *lab) { PetscErrorCode ierr; PetscFunctionBegin; ierr = PetscViewerCreate(comm,lab);CHKERRQ(ierr); ierr = PetscViewerSetType(*lab,PETSC_VIEWER_SOCKET);CHKERRQ(ierr); ierr = PetscViewerSocketSetConnection(*lab,machine,port);CHKERRQ(ierr); PetscFunctionReturn(0); }
/*@C PetscSocketEstablish - starts a listener on a socket Input Parameters: . portnumber - the port to wait at Output Parameters: . ss - the socket to be used with PetscSocketListen() Level: advanced .seealso: PetscSocketListen(), PetscOpenSocket() @*/ PETSC_INTERN PetscErrorCode PetscSocketEstablish(int portnum,int *ss) { char myname[MAXHOSTNAME+1]; int s; PetscErrorCode ierr; struct sockaddr_in sa; struct hostent *hp; PetscFunctionBegin; ierr = PetscGetHostName(myname,MAXHOSTNAME);CHKERRQ(ierr); ierr = PetscMemzero(&sa,sizeof(struct sockaddr_in));CHKERRQ(ierr); hp = gethostbyname(myname); if (!hp) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"Unable to get hostent information from system"); sa.sin_family = hp->h_addrtype; sa.sin_port = htons((u_short)portnum); if ((s = socket(AF_INET,SOCK_STREAM,0)) < 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"Error running socket() command"); #if defined(PETSC_HAVE_SO_REUSEADDR) { int optval = 1; /* Turn on the option */ ierr = setsockopt(s,SOL_SOCKET,SO_REUSEADDR,(char*)&optval,sizeof(optval));CHKERRQ(ierr); } #endif while (bind(s,(struct sockaddr*)&sa,sizeof(sa)) < 0) { #if defined(PETSC_HAVE_WSAGETLASTERROR) ierr = WSAGetLastError(); if (ierr != WSAEADDRINUSE) { #else if (errno != EADDRINUSE) { #endif close(s); SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"Error from bind()"); } } listen(s,0); *ss = s; return(0); } /*@C PetscSocketListen - Listens at a socket created with PetscSocketEstablish() Input Parameter: . listenport - obtained with PetscSocketEstablish() Output Parameter: . t - pass this to read() to read what is passed to this connection Level: advanced .seealso: PetscSocketEstablish() @*/ PETSC_INTERN PetscErrorCode PetscSocketListen(int listenport,int *t) { struct sockaddr_in isa; #if defined(PETSC_HAVE_ACCEPT_SIZE_T) size_t i; #else int i; #endif PetscFunctionBegin; /* wait for someone to try to connect */ i = sizeof(struct sockaddr_in); if ((*t = accept(listenport,(struct sockaddr*)&isa,(socklen_t*)&i)) < 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"error from accept()\n"); PetscFunctionReturn(0); } /*@C PetscViewerSocketOpen - Opens a connection to a MATLAB or other socket based server. Collective on MPI_Comm Input Parameters: + comm - the MPI communicator . machine - the machine the server is running on,, use NULL for the local machine, use "server" to passively wait for a connection from elsewhere - port - the port to connect to, use PETSC_DEFAULT for the default Output Parameter: . lab - a context to use when communicating with the server Level: intermediate Notes: Most users should employ the following commands to access the MATLAB PetscViewers $ $ PetscViewerSocketOpen(MPI_Comm comm, char *machine,int port,PetscViewer &viewer) $ MatView(Mat matrix,PetscViewer viewer) $ $ or $ $ PetscViewerSocketOpen(MPI_Comm comm,char *machine,int port,PetscViewer &viewer) $ VecView(Vec vector,PetscViewer viewer) Options Database Keys: For use with PETSC_VIEWER_SOCKET_WORLD, PETSC_VIEWER_SOCKET_SELF, PETSC_VIEWER_SOCKET_() or if NULL is passed for machine or PETSC_DEFAULT is passed for port $ -viewer_socket_machine <machine> $ -viewer_socket_port <port> Environmental variables: + PETSC_VIEWER_SOCKET_PORT portnumber - PETSC_VIEWER_SOCKET_MACHINE machine name Currently the only socket client available is MATLAB. See src/dm/examples/tests/ex12.c and ex12.m for an example of usage. Notes: The socket viewer is in some sense a subclass of the binary viewer, to read and write to the socket use PetscViewerBinaryRead(), PetscViewerBinaryWrite(), PetscViewerBinarWriteStringArray(), PetscViewerBinaryGetDescriptor(). Use this for communicating with an interactive MATLAB session, see PETSC_VIEWER_MATLAB_() for writing output to a .mat file. Use PetscMatlabEngineCreate() or PETSC_MATLAB_ENGINE_(), PETSC_MATLAB_ENGINE_SELF, or PETSC_MATLAB_ENGINE_WORLD for communicating with a MATLAB Engine Concepts: MATLAB^sending data Concepts: sockets^sending data .seealso: MatView(), VecView(), PetscViewerDestroy(), PetscViewerCreate(), PetscViewerSetType(), PetscViewerSocketSetConnection(), PETSC_VIEWER_SOCKET_, PETSC_VIEWER_SOCKET_WORLD, PETSC_VIEWER_SOCKET_SELF, PetscViewerBinaryWrite(), PetscViewerBinaryRead(), PetscViewerBinaryWriteStringArray(), PetscBinaryViewerGetDescriptor(), PetscMatlabEngineCreate() @*/ PetscErrorCode PetscViewerSocketOpen(MPI_Comm comm,const char machine[],int port,PetscViewer *lab) { PetscErrorCode ierr; PetscFunctionBegin; ierr = PetscViewerCreate(comm,lab);CHKERRQ(ierr); ierr = PetscViewerSetType(*lab,PETSCVIEWERSOCKET);CHKERRQ(ierr); ierr = PetscViewerSocketSetConnection(*lab,machine,port);CHKERRQ(ierr); PetscFunctionReturn(0); }