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; }
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; }
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; }
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 ); }