示例#1
0
/* 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);
		}
	}
}
示例#2
0
文件: server.c 项目: E-LLP/QuIP
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