Beispiel #1
0
int main(int argc, char *argv[])
{
    struct kevent chlist[2];   /* events we want to monitor */
    struct kevent evlist[2];   /* events that were triggered */
    char buf[BUFSIZE];
    int sckfd, kq, nev, i;
    
    /* check argument count */
    if (argc != 3) {
        fprintf(stderr, "usage: %s host port\n", argv[0]);
        exit(EXIT_FAILURE);
    }
    
    /* open a connection to a host:port pair */
    sckfd = tcpopen(argv[1], atoi(argv[2]));
    
    /* create a new kernel event queue */
    if ((kq = kqueue()) == -1)
        diep("kqueue()");
    
    /* initialise kevent structures */
    EV_SET(&chlist[0], sckfd, EVFILT_READ, EV_ADD | EV_ENABLE, 0, 0, 0);
    EV_SET(&chlist[1], fileno(stdin), EVFILT_READ, EV_ADD | EV_ENABLE, 0, 0, 0);
    
    /* loop forever */
    for (;;) {
        nev = kevent(kq, chlist, 2, evlist, 2, NULL);
        
        if (nev < 0)
            diep("kevent()");
        
        else if (nev > 0) {
            if (evlist[0].flags & EV_EOF)                       /* read direction of socket has shutdown */
                exit(EXIT_FAILURE);
            
            for (i = 0; i < nev; i++) {
                if (evlist[i].flags & EV_ERROR) {                /* report errors */
                    fprintf(stderr, "EV_ERROR: %s\n", strerror(evlist[i].data));
                    exit(EXIT_FAILURE);
                }
                
                if (evlist[i].ident == sckfd) {                  /* we have data from the host */
                    memset(buf, 0, BUFSIZE);
                    if (read(sckfd, buf, BUFSIZE) < 0)
                        diep("read()");
                    fputs(buf, stdout);
                }
                
                else if (evlist[i].ident == fileno(stdin)) {     /* we have data from stdin */
                    memset(buf, 0, BUFSIZE);
                    fgets(buf, BUFSIZE, stdin);
                    sendbuftosck(sckfd, buf, strlen(buf));
                }
            }
        }
    }
    
    close(kq);
    return EXIT_SUCCESS;
}
Beispiel #2
0
Datei: ii.c Projekt: hedbuz/ii
int main(int argc, char *argv[]) {
	int i;
	unsigned short port = SERVER_PORT;
	struct passwd *spw = getpwuid(getuid());
	char *key = NULL, *fullname = NULL;
	char prefix[_POSIX_PATH_MAX];

	if(!spw) {
		fputs("ii: getpwuid() failed\n", stderr);
		exit(EXIT_FAILURE);
	}
	snprintf(nick, sizeof(nick), "%s", spw->pw_name);
	snprintf(prefix, sizeof(prefix),"%s/irc", spw->pw_dir);
	if (argc <= 1 || (argc == 2 && argv[1][0] == '-' && argv[1][1] == 'h')) usage();

	for(i = 1; (i + 1 < argc) && (argv[i][0] == '-'); i++) {
		switch (argv[i][1]) {
			case 'i': snprintf(prefix,sizeof(prefix),"%s", argv[++i]); break;
			case 's': host = argv[++i]; break;
			case 'p': port = strtol(argv[++i], NULL, 10); break;
			case 'n': snprintf(nick,sizeof(nick),"%s", argv[++i]); break;
			case 'k': key = getenv(argv[++i]); break;
			case 'e': use_ssl = 1; ++i; break;
			case 'f': fullname = argv[++i]; break;
			default: usage(); break;
		}
	}
	if(use_ssl)
		port = port == SERVER_PORT ? SSL_SERVER_PORT : port;
	irc = tcpopen(port);
	if(!snprintf(path, sizeof(path), "%s/%s", prefix, host)) {
		fputs("ii: path to irc directory too long\n", stderr);
		exit(EXIT_FAILURE);
	}
	create_dirtree(path);

	add_channel(""); /* master channel */
	login(key, fullname);
	run();

	return EXIT_SUCCESS;
}
Beispiel #3
0
int main( int argc, char *argv[] )
{
  char action;
  int sd;
  int ch;
  int i,j;

  if ( argc < 3 ) {
    printf("Usage: %s -p port\n", argv[0] );
    exit(1);
  }

    // open socket to Game Engine
  sd = tcpopen("localhost", atoi( argv[2] ));

  pipe_fd    = sd;
  in_stream  = fdopen(sd,"r");
  out_stream = fdopen(sd,"w");

  while(1) {
      // scan 5-by-5 wintow around current location
    for( i=0; i < 5; i++ ) {
      for( j=0; j < 5; j++ ) {
        if( !(( i == 2 )&&( j == 2 ))) {
          ch = getc( in_stream );
          if( ch == -1 ) {
            exit(1);
          }
          view[i][j] = ch;
        }
      }
    }

    print_view(); // COMMENT THIS OUT BEFORE SUBMISSION
    action = get_action( view );
    putc( action, out_stream );
    fflush( out_stream );
  }

  return 0;
}
Beispiel #4
0
void TPC_srv(void (*conn_init)(T_Connect *,T_NetHead *),void (*quit)(int),void (*poolchk)(void),int sizeof_gda)
{
int ret;
struct sockaddr_in sin,cin;
struct servent *sp;
char *p;
int s;
pthread_t pthread_id;
pthread_attr_t attr;
struct timeval tm;
fd_set efds;
socklen_t leng=1;
int sock=-1;
T_Connect Conn;
struct linger so_linger;

	tzset();

	ret= pthread_attr_init(&attr);
	if(ret) {
		ShowLog(1,"can not init pthread attr %s",strerror(ret));
		return ;
	}
//设置分离线程  
	ret=pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);
	if(ret) {
		ShowLog(1,"can't set pthread attr:%s",strerror(ret));
		return ;
	}
//设置线程堆栈保护区 256K  
	ret=pthread_attr_setguardsize(&attr,(size_t)(1024 * 256));

	SRVFUNC=Function;
	
	signal(SIGPIPE,SIG_IGN);
	signal(SIGHUP,SIG_IGN);
	signal(SIGINT ,SIG_IGN);
	signal(SIGPWR ,quit);
	signal(SIGTERM,quit);

	initconnect(&Conn);
	Conn.family=family;
	Conn.Var=0;

	p=getenv("SERVICE");
	if(!p || !*p) {
		ShowLog(1,"缺少环境变量 SERVICE ,不知守候哪个端口!");
		quit(3);
	}
//测试端口是否被占用 
	sock=tcpopen("localhost",p);
	if(sock>-1) {
		ShowLog(1,"端口 %s 已经被占用",p);
		close(sock);
		sock=-1;
		quit(255);
	}

	bzero(&sin,sizeof(sin));
	sin.sin_family = AF_INET;
	sin.sin_addr.s_addr = INADDR_ANY;

	if(isdigit(*p)){
		sin.sin_port=htons((u_short)atoi(p));
	} else {
		if((sp=getservbyname(p,"tcp"))==NULL){
        		ShowLog(1,"getsrvbyname %s error",p);
        		quit(3);
		}
		sin.sin_port=(u_short)sp->s_port;
	}

	sock=socket(AF_INET,SOCK_STREAM,0);
	if(sock < 0) {
		ShowLog(1,"open socket error=%d,%s",errno,
			strerror(errno));
		quit(3);
	}

	bind(sock,(struct sockaddr *)&sin,sizeof(sin));
	leng=1;
	setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,&leng,sizeof(leng));
//避免 TIME_WAIT
	so_linger.l_onoff=1;
	so_linger.l_linger=0;
	ret=setsockopt(sock, SOL_SOCKET, SO_LINGER, &so_linger, sizeof so_linger);
	if(ret) ShowLog(1,"set SO_LINGER err=%d,%s",errno,strerror(errno));


	leng=sizeof(cin);
	int repeat=0;
		ShowLog(0,"work start!main sock=%d",sock);

	p=getenv("TIMEOUT");
        if(p && isdigit(*p)) {
                Conn.timeout=60*atoi(p);
        } else Conn.timeout=0;

	p=getenv("SENDSIZE");
        if(p && isdigit(*p)) {
                Conn.MTU=atoi(p);
        } else Conn.MTU=0;
//避免 TIME_WAIT
          so_linger.l_onoff=1;
          so_linger.l_linger=0;
          ret=setsockopt(sock, SOL_SOCKET, SO_LINGER, &so_linger, sizeof so_linger);
          if(ret) ShowLog(1,"set SO_LINGER err=%d,%s",errno,strerror(errno));


	listen(sock,1000);// 以后用配置 
	while(1) {
		do {
			FD_ZERO(&efds);
			FD_SET(sock, &efds);
//健康检查周期5分钟 
			tm.tv_sec=300;
			tm.tv_usec=0;
			ret=select(sock+1,&efds,NULL,&efds,&tm);
//ShowLog(4,"%s:aft select ret=%d,sock=%d",__FUNCTION__,ret,sock);
			if(ret==-1) {
				ShowLog(1,"select error %s",strerror(errno));
				close(sock);
				quit(3);
			}
			if(ret==0 && poolchk) poolchk();
		} while(ret<=0);
		s=accept(sock,(struct sockaddr *)&cin,&leng);
		if(s<0) {
			ShowLog(1,"%s:accept err=%d,%s",__FUNCTION__,errno,strerror(errno));
			switch(errno) {
			case EMFILE:	//fd用完了,其他线程还要继续工作,主线程休息一下。  
			case ENFILE:
				sleep(30);
				continue;
			default:break;
			}
			sleep(3);
			if(++repeat < 20) continue;
			ShowLog(1,"%s:network fail! err=%s",__FUNCTION__,strerror(errno));
			close(sock);
			quit(5);
		}
		Conn.Socket=s;
		Conn.only_do=(int (*)())conn_init; //借用一下 
		Conn.SendLen=sizeof_gda;
		ret=pthread_create(&pthread_id,&attr,thread_work,&Conn);
		if(ret) {
			ShowLog(1,"%s:pthread_create:%s",__FUNCTION__,strerror(ret));
			close(s);
			if(ret==EAGAIN||ret==ENOMEM) {	//线程数用完了,休息一会,等一些线程退出 
				sleep(30);
			}
			continue;
		}
		while(Conn.Socket != -1) usleep(1000);
	}
	
	ret=pthread_attr_destroy(&attr);
	close(sock);
	quit(0);
}
int
nsldapi_connect_to_host( LDAP *ld, Sockbuf *sb, char *host, unsigned long address,
	int port, int async, int secure )
/*
 * if host == NULL, connect using address
 * "address" and "port" must be in network byte order
 * zero is returned upon success, -1 if fatal error, -2 EINPROGRESS
 * if -1 is returned, ld_errno is set
 * async is only used ifndef NO_REFERRALS (non-0 means don't wait for connect)
 * XXX async is not used yet!
 */
{
	void			*tcps;
	short 			i;
	int				err;
    InetHostInfo	hi;

	LDAPDebug( LDAP_DEBUG_TRACE, "connect_to_host: %s:%d\n",
	    ( host == NULL ) ? "(by address)" : host, ntohs( port ), 0 );

	/* Initialize OpenTransport, or find out from the host app whether it is installed */
	(void)tcp_init();
	
	if ( host != NULL && gethostinfobyname( host, &hi ) != noErr ) {
		LDAP_SET_LDERRNO( ld, LDAP_CONNECT_ERROR, NULL, NULL );
		return( -1 );
	}

	if ( ld->ld_socket_fn == NULL ) {
		tcps = tcpopen( NULL, TCP_BUFSIZ );
	} else {
		tcps = ld->ld_socket_fn( AF_INET, SOCK_STREAM, 0 );
	}

	if ( tcps == NULL ) {
		LDAP_SET_LDERRNO( ld, LDAP_LOCAL_ERROR, NULL, NULL );
		return( -1 );
	}

	if ( secure && ld->ld_ssl_enable_fn( tcps ) < 0 ) {
		if ( ld->ld_close_fn == NULL ) {
			tcpclose( (tcpstream *)tcps );
		} else {
			ld->ld_close_fn( tcps );
		}
		LDAP_SET_LDERRNO( ld, LDAP_LOCAL_ERROR, NULL, NULL );
		return( -1 );
	}

    for ( i = 0; host == NULL || hi.addrs[ i ] != 0; ++i ) {
    	if ( host != NULL ) {
			SAFEMEMCPY( (char *)&address, (char *)&hi.addrs[ i ], sizeof( long ));
		}


		if ( ld->ld_connect_fn == NULL ) {
			if ( tcpconnect( tcps, address, port ) == 0 ) {
				err = -1;
			} else {
				err = 0;
			}
		} else {
			struct sockaddr_in	sin;
			(void)memset( (char *)&sin, 0, sizeof( struct sockaddr_in ));
			sin.sin_family = AF_INET;
			sin.sin_port = port;
			sin.sin_addr.s_addr = address;

			err = ld->ld_connect_fn( tcps, (struct sockaddr *)&sin,
				sizeof( struct sockaddr_in ));
		}

		if ( err == 0 ) {
			sb->sb_sd = (void *)tcps;
			return( 0 );
		}

		if ( host == NULL ) {	/* using single address -- not hi.addrs array */
			break;
		}
	}
	
	LDAPDebug( LDAP_DEBUG_TRACE, "tcpconnect failed\n", 0, 0, 0 );
	LDAP_SET_LDERRNO( ld, LDAP_CONNECT_ERROR, NULL, NULL );
	LDAP_SET_ERRNO( ld, EHOSTUNREACH );  /* close enough */

	if ( ld->ld_close_fn == NULL ) {
		tcpclose( (tcpstream *)tcps );
	} else {
		ld->ld_close_fn( tcps );
	}
	return( -1 );
}