/* Allocate the receive queue, and create the slave and proxy threads. * max_buf_size and the merge-related fields of default_sstate must * already be initialized. */ void protocol_init(char *slave_port, char *proxy_port, int max_slaves) { start_time = time_now(); queue_max_length = max_slaves * MAX_GENMOVES_PER_SLAVE; receive_queue = calloc2(queue_max_length, sizeof(*receive_queue)); default_sstate.slave_sock = port_listen(slave_port, max_slaves); default_sstate.last_processed = -1; for (int n = 0; n < BUFFERS_PER_SLAVE; n++) { default_sstate.b[n].queue_index = -1; } pthread_t thread; for (int id = 0; id < max_slaves; id++) { pthread_create(&thread, NULL, slave_thread, (void *)(long)id); } if (proxy_port) { int proxy_sock = port_listen(proxy_port, max_slaves); for (int id = 0; id < max_slaves; id++) { pthread_create(&thread, NULL, proxy_thread, (void *)(long)proxy_sock); } } }
int open_server_port(QSP_ARG_DECL const char *name,int port_no) { Port *mpp; #ifdef HAVE_SOCKET socklen_t length; #endif // HAVE_SOCKET int on=1; if ( (port_no < 2001) || (port_no > 6999) ) { WARN("Illegal port number"); advise("Use 2001-6999"); advise("Check /etc/services for other conflicts"); return(-1); } mpp=new_port(QSP_ARG name); if( mpp==NO_PORT ){ if( verbose ){ sprintf(ERROR_STRING,"open_server_port %s %d failed to create port struct", name,port_no); WARN(ERROR_STRING); } return(-1); } #ifdef HAVE_SOCKET mpp->mp_o_sock=socket(AF_INET,SOCK_STREAM,0); //fprintf(stderr,"socket returned %d (0x%x)\n", //mpp->mp_o_sock,mpp->mp_o_sock); #ifdef FOOBAR // pc-nfs??? mpp->mp_o_sock=socket(PF_INET,SOCK_STREAM,0); #endif /* FOOBAR */ #else // ! HAVE_SOCKET WARN("open_server_port: Sorry, no socket implementation available!?"); mpp->mp_o_sock=(-1); #endif // HAVE_SOCKET #ifdef BUILD_FOR_WINDOWS if( mpp->mp_o_sock == INVALID_SOCKET ){ int e; e=WSAGetLastError(); fprintf(stderr,"Invalid socket, error code = %d\n",e); switch(e){ case WSANOTINITIALISED: WARN("Missing call to WSAStartup!?"); break; default: WARN("Unclassified error."); break; } } #endif // BUILD_FOR_WINDOWS // sleeptime used to be signed, but not now. //mpp->mp_sleeptime=(-1); mpp->mp_sleeptime=0; mpp->mp_sock=(-1); if( mpp->mp_o_sock<0 ){ tell_sys_error("open_server_port (socket)"); WARN("error opening stream socket"); delport(QSP_ARG mpp); return(-1); } #ifdef HAVE_SOCKET fprintf(stderr,"Setting socket options...\n"); setsockopt(mpp->mp_o_sock,SOL_SOCKET,SO_REUSEADDR, (char *)&on,sizeof(on)); mpp->mp_addrp = (struct sockaddr_in *) getbuf( sizeof(*(mpp->mp_addrp) ) ); if( mpp->mp_addrp == NULL ) mem_err("open_server_port"); mpp->mp_flags = 0; mpp->mp_flags |= PORT_SERVER; // makes it keep trying! mpp->mp_pp = NO_PORT; mpp->mp_text_var_name=NULL; mpp->mp_output_filename=NULL; mpp->mp_auth_string=NULL; mpp->mp_portnum = port_no; mpp->mp_addrp->sin_family = AF_INET; mpp->mp_addrp->sin_addr.s_addr = INADDR_ANY; length=sizeof(*(mpp->mp_addrp)); mpp->mp_addrp->sin_port = htons( port_no ); fprintf(stderr,"Binding socket...\n"); if( bind(mpp->mp_o_sock,(struct sockaddr *)(mpp->mp_addrp), length) ){ tell_sys_error("bind"); WARN("open_server_port: couldn't bind to port"); goto cleanup; } fprintf(stderr,"Getting socket name...\n"); if( getsockname(mpp->mp_o_sock, (struct sockaddr *)mpp->mp_addrp,&length) ){ WARN("open_server_port: error getting socket name"); goto cleanup; } /* We used to make sure that the port number * was the one we requested, but we no longer * insist upon that... */ if( port_listen(QSP_ARG mpp) < 0 ) goto cleanup; fprintf(stderr,"Back from port_listen...\n"); #endif // HAVE_SOCKET return(port_no); cleanup: givbuf((char *)mpp->mp_addrp); mpp->mp_addrp = NULL; delport(QSP_ARG mpp); return(-1); } // open_server_port