Exemplo n.º 1
0
void Client::connectionPhase()
{
	packet.clear();

	packetID = EMPTY;

	TCPsocket.receive(packet);

	packet>>packetID;

	switch(packetID)
	{
		case EMPTY:
			break;
		case CONTINUE:
			currentPhase = DOWNLOADS;
			std::cout<<"Client going to downloadsPhase"<<std::endl;
			break;
		case START:
			handleStartPacket();
			break;
	}
}
Exemplo n.º 2
0
int main(int argc, char **argv) {
	host_t ftHost, rdaHost;
	int rdaSocket;
	ft_buffer_server_t *S;
	
	if (sizeof(rda_msg_hdr_t)!=24) {
		fprintf(stderr, "Compiled-in datatypes do not match RDA protocol\n");
		exit(1);
	}

		
	if (argc!=5 && argc!=3) {
		fputs(usage, stderr);
		exit(1);
	}
	
	strncpy(rdaHost.name, argv[1], sizeof(rdaHost.name));
	rdaHost.name[sizeof(rdaHost.name)-1]=0;
	rdaHost.port = atoi(argv[2]);
	
	if (argc==5) {
		strncpy(ftHost.name, argv[3], sizeof(ftHost.name));
		ftHost.name[sizeof(ftHost.name)-1]=0;
		ftHost.port = atoi(argv[4]);
	} else {
		strcpy(ftHost.name, "-");
		ftHost.port = 1972;
	}
	
	/* this isn't a FieldTrip connection, but we can use the same function */
	rdaSocket = open_connection(rdaHost.name, rdaHost.port);
	if (rdaSocket < 0) {
		fprintf(stderr, "Could not connect to RDA server at %s:%i\n", rdaHost.name, rdaHost.port);
		return 1;
	}
				
	/* Spawn tcpserver or connect to remote buffer */
	if (strcmp(ftHost.name, "-") == 0) {
		S = ft_start_buffer_server(ftHost.port, NULL, NULL, NULL);
		if (S==NULL) {
			fprintf(stderr, "Could not start up a FieldTrip buffer serving at port %i\n", ftHost.port);
			return 1;
		}
		ftSocket = 0; 
		printf("Streaming from %s:%i to local buffer on port %i\n", rdaHost.name, rdaHost.port, ftHost.port);
	} else {
		ftSocket = open_connection(ftHost.name, ftHost.port);
		
		if (ftSocket < 0) {
			fprintf(stderr, "Could not connect to FieldTrip buffer at %s:%i\n", ftHost.name, ftHost.port);
			return 1;
		}
		printf("Streaming from %s:%i to remote buffer at %s:%i\n", rdaHost.name, rdaHost.port, ftHost.name, ftHost.port);
	}		
	
	/* register CTRL-C handler */
	signal(SIGINT, abortHandler);
	
	printf("Starting to listen - press CTRL-C to quit\n");

	while (keepRunning) {
		rda_msg_hdr_t header;
		char *buf;
		int n,s;
		
		n = bufread(rdaSocket, &header, sizeof(header));
		
		if (n!=sizeof(header)) {
			fprintf(stderr, "Error while reading packet header from the RDA server\n");
			break;
		}
		
		if (memcmp(_rda_guid, header.guid, 16)!=0) {
			int i;
			fprintf(stderr, "Incorrect GUID in received packet:\n");
			for (i=0;i<16;i++) {
				fprintf(stderr, "0x%02x   should be 0x%02x\n", header.guid[i], _rda_guid[i]);
			}
			break;
		}
		
		buf = (char *) malloc(header.nSize);
		if (buf == NULL) {
			fprintf(stderr, "Out of memory\n");
			break;
		}
		
		memcpy(buf, &header, sizeof(header));
		s = header.nSize - sizeof(header);
		n = bufread(rdaSocket, buf + sizeof(header), s);
		if (s!=n) {
			fprintf(stderr, "Error while reading packet remainder from the RDA server\n");
			free(buf);
			break;
		}
		
		switch(header.nType) {
			case RDA_START_MSG:
				handleStartPacket(ftSocket, header.nSize, buf);
				break;
			case RDA_INT_MSG:
			case RDA_FLOAT_MSG:			
				handleDataPacket(ftSocket, header.nSize, buf);
				break;
			case RDA_STOP_MSG:
				printf("\nRemote Data Acquisition stopped\n\n");
				break;
			default:
				fprintf(stderr, "Unrecognized packet type (%i), has size %i - exiting\n", header.nType, header.nSize);
				keepRunning = 0;
				break;
		}
		
		free(buf);
	}

	close_connection(rdaSocket);

	if (ftSocket > 0) {
		close_connection(ftSocket);
	} else {
		ft_stop_buffer_server(S);
	}
	
	return 0;
}