示例#1
0
static int ServiceMain(int argc, char **argv) {
  SOCKET s;
  int status;
  static struct sockaddr_in sin;
  int tablesize = FD_SETSIZE;
  extern fd_set FdActive();
  struct timeval timeout = {1,0};
  int error_count=0;
  fd_set readfds;
  fd_set fdactive;
  RedirectOutput();
  InitializeService();
  SetThisServiceStatus(SERVICE_RUNNING,0);
  if (GetMulti()) {
    IoRoutines *io;
    io=LoadIo(GetProtocol());
    if (io && io->listen)
      io->listen(argc,argv);
    else {
      fprintf(stderr,"Protocol %s does not support servers\n",GetProtocol());
      return 1;
    }
    return 0;
  } else {
    s = socket(AF_INET, SOCK_STREAM, 0);
    if (s == -1) {
      printf("Error getting Connection Socket\n");
      exit(1);
    }
    memset(&sin,0,sizeof(sin));
    sin.sin_port = GetPort();
    sin.sin_family = AF_INET;
    sin.sin_addr.s_addr = INADDR_ANY;
    status = bind(s, (struct sockaddr *)&sin, sizeof(struct sockaddr_in));
    if (status < 0)  {
      perror("Error binding to service\n");
      exit(1);
    }
    status = listen(s,128);
    if (status < 0)  {
      perror("Error listen on port\n");
      exit(1);
    }
    FD_ZERO(&fdactive);
    FD_SET(s,&fdactive);
    for (readfds=fdactive;!shut;readfds=fdactive) {
      int sstatus;
      if ((sstatus = select(tablesize, &readfds, 0, 0, &timeout)) != SOCKET_ERROR) {
        error_count=0;
        if (FD_ISSET(s, &readfds)){
		  int len = sizeof(struct sockaddr_in);
		  SOCKET sock = accept(s, (struct sockaddr *)&sin, &len);
		  SpawnWorker(sock);
        }
      } else {
        error_count++;
        perror("error in main select");
        fprintf(stderr,"Error count=%d\n",error_count);
	    fflush(stderr);
        if (error_count > 100) {
          fprintf(stderr,"Error count exceeded, shutting down\n");
          shut=1;
        }
	  }
    }
    shutdown(s,2);
    return 1;
  }
}
示例#2
0
static void exitHandler(void) {}
#else
static void exitHandler(void) {
  int id;
  void *ctx=0;
  while((id=NextConnection(&ctx,0,0,0)) != -1) {
    DisconnectConnection(id);
    ctx=0;
  }
}
#endif


int NewConnection(char *protocol) {
  Connection *oldhead,*new;
  IoRoutines *io=LoadIo(protocol);
  static int id=1;
  static int registerExitHandler=1;
  if (io) {
    registerExitHandler=registerExitHandler ? atexit(exitHandler) : 0;
    new=memset(malloc(sizeof(Connection)),0,sizeof(Connection));
    new->io=io;
    new->readfd=-1;
    lock_connection_list();
    oldhead = ConnectionList;
    ConnectionList=new;
    new->id=id++;
    new->message_id=-1;
    new->next=oldhead;
    new->protocol=strcpy(malloc(strlen(protocol)+1),protocol);
    unlock_connection_list();