Пример #1
0
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;
}
Пример #2
0
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;
}