void mexFunction(int nlhs,mxArray *plhs[],int nrhs,const mxArray *prhs[]) { int t = 0; Linger linger; linger.onoff = 1; linger.time = 0; if (!nrhs) PETSC_MEX_ERROR("Needs one argument, the port"); t = (int)*mxGetPr(prhs[0]); if (setsockopt(t,SOL_SOCKET,SO_LINGER,(char*)&linger,sizeof(Linger))) PETSC_MEX_ERROR("Setting linger"); if (close(t)) PETSC_MEX_ERROR("closing socket"); return; }
int establish(u_short portnum) { char myname[MAXHOSTNAME+1]; int s; struct sockaddr_in sa; struct hostent *hp; #if defined(PETSC_HAVE_UNAME) struct utsname utname; #elif defined(PETSC_HAVE_GETCOMPUTERNAME) int namelen=MAXHOSTNAME; #endif /* Note we do not use gethostname since that is not POSIX */ #if defined(PETSC_HAVE_GETCOMPUTERNAME) GetComputerName((LPTSTR)myname,(LPDWORD)&namelen); #elif defined(PETSC_HAVE_UNAME) uname(&utname); strncpy(myname,utname.nodename,MAXHOSTNAME); #endif #if defined(PETSC_HAVE_BZERO) bzero(&sa,sizeof(struct sockaddr_in)); #else memset(&sa,0,sizeof(struct sockaddr_in)); #endif hp = gethostbyname(myname); if (!hp) PETSC_MEX_ERRORQ("RECEIVE: error from gethostbyname\n"); sa.sin_family = hp->h_addrtype; sa.sin_port = htons(portnum); if ((s = socket(AF_INET,SOCK_STREAM,0)) < 0) PETSC_MEX_ERRORQ("RECEIVE: error from socket\n"); { int optval = 1; /* Turn on the option */ (void) setsockopt(s,SOL_SOCKET,SO_REUSEADDR,(char*)&optval,sizeof(optval)); } while (bind(s,(struct sockaddr*)&sa,sizeof(sa)) < 0) { #if defined(PETSC_HAVE_WSAGETLASTERROR) PetscErrorCode ierr; ierr = WSAGetLastError(); if (ierr != WSAEADDRINUSE) { #else if (errno != EADDRINUSE) { #endif close(s); PETSC_MEX_ERRORQ("RECEIVE: error from bind\n"); return(-1); } close(listenport); } listen(s,0); return(s); } /*-----------------------------------------------------------------*/ /* */ /*-----------------------------------------------------------------*/ PETSC_EXTERN void mexFunction(int nlhs,mxArray *plhs[],int nrhs,const mxArray *prhs[]) { int t,portnumber; /* check output parameters */ if (nlhs != 1) PETSC_MEX_ERROR("Open requires one output argument."); /* figure out portnumber user wants to use; default to 5005 */ if (!nrhs) { char *str; str = getenv("PETSC_VIEWER_SOCKET_PORT"); if (str) portnumber = atoi(str); else portnumber = PETSCSOCKETDEFAULTPORT; } else portnumber = (int)*mxGetPr(prhs[0]); /* open connection */ t = SOCKConnect_Private(portnumber); if (t == -1) PETSC_MEX_ERROR("opening socket"); plhs[0] = mxCreateDoubleMatrix(1,1,mxREAL); *mxGetPr(plhs[0]) = t; return; }