//Client thread for RX IQ stream void* client_thread(void* arg) { CLIENT* client=(CLIENT*)arg; int old_state, old_type; char command[80]; int bytes_read; const char* response; client->receiver_state=RECEIVER_DETACHED; client->transmitter_state=TRANSMITTER_DETACHED; client->receiver_num=-1; pthread_mutex_init(&client->mox_lock, NULL ); set_mox(client,0); pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,&old_state); pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS,&old_type); while(1) { bytes_read=recv(client->socket,command,sizeof(command),0); if(bytes_read<=0) { break; } command[bytes_read]=0; response=parse_command(client,command); send(client->socket,response,strlen(response),0); fprintf(stderr,"Response to DSP client (Rx%d): '%s'\n",client->receiver_num,response); } fprintf(stderr,"Exiting DSP client thread loop (Rx%d)...\n",client->receiver_num); //GRACEFUL EXIT ON DISCONNECTION set_mox(client,0); if(client->transmitter_state==TRANSMITTER_ATTACHED) { stop_tx_audio(client); //Exits the tx_audio_thread @ transmitter client->transmitter_state=TRANSMITTER_DETACHED; } sleep(1); if(client->receiver_state==RECEIVER_ATTACHED) { detach_receiver(client->receiver_num, client); receiver[client->receiver_num].client=(CLIENT*)NULL; client->receiver_state=RECEIVER_DETACHED; } client->bs_port=-1; detach_bandscope(client); #ifdef __linux__ close(client->socket); #else closesocket(client->socket); #endif fprintf(stderr,"Client Handler: Client disconnected: %s:%d\n",inet_ntoa(client->address.sin_addr),ntohs(client->address.sin_port)); free(client); return 0; }
void* client_thread(void* arg) { CLIENT* client=(CLIENT*)arg; char command[80]; int bytes_read; const char* response; client->receiver_state=RECEIVER_DETACHED; client->transmitter_state=TRANSMITTER_DETACHED; client->receiver=-1; client->mox=0; while(1) { bytes_read=recv(client->socket,command,sizeof(command),0); if(bytes_read<=0) { break; } command[bytes_read]=0; response=parse_command(client,command); send(client->socket,response,strlen(response),0); fprintf(stderr,"Response to DSP client (Rx%d): '%s'\n",client->receiver,response); } fprintf(stderr,"Exiting DSP client thread loop (Rx%d)...\n",client->receiver); if(client->receiver_state==RECEIVER_ATTACHED) { receiver[client->receiver].client=(CLIENT*)NULL; client->receiver_state=RECEIVER_DETACHED; } if(client->transmitter_state==TRANSMITTER_ATTACHED) { client->transmitter_state=TRANSMITTER_DETACHED; } client->mox=0; client->bs_port=-1; detach_bandscope(client); #ifdef __linux__ close(client->socket); #else closesocket(client->socket); #endif fprintf(stderr,"Clint Handler: Client disconnected: %s:%d\n",inet_ntoa(client->address.sin_addr),ntohs(client->address.sin_port)); free(client); return 0; }
const char* parse_command(CLIENT* client,char* command) { char* token; fprintf(stderr,"parse_command(Rx%d): '%s'\n",client->receiver,command); token=strtok(command," \r\n"); if(token!=NULL) { if(strcmp(token,"attach")==0) { //COMMAND: 'attach <side>' token=strtok(NULL," \r\n"); if(token!=NULL) { if(strcmp(token,"tx")==0) { //COMMAND: 'attach tx' return attach_transmitter(client); } else { //COMMAND: 'attach rx#' int rx=atoi(token); return attach_receiver(rx,client); } } else { return INVALID_COMMAND; } } else if(strcmp(token,"detach")==0) { //COMMAND: 'detach <side>' token=strtok(NULL," \r\n"); if(token!=NULL) { int rx=atoi(token); return detach_receiver(rx,client); } else { return INVALID_COMMAND; } } else if(strcmp(token,"frequency")==0) { //COMMAND: 'frequency <long freq>' token=strtok(NULL," \r\n"); if(token!=NULL) { long f=atol(token); return set_frequency(client,f); } else { return INVALID_COMMAND; } } else if(strcmp(token,"start")==0) { //COMMAND: 'start <stream> <port#>' token=strtok(NULL," \r\n"); if(token!=NULL) { if(strcmp(token,"iq")==0) { //COMMAND: 'start iq <port#>' token=strtok(NULL," \r\n"); if(token!=NULL) { client->iq_port=atoi(token); } // starts the thread to acquire USRP samples usrp_start (&receiver[client->receiver]); fprintf(stderr,"Started USRP for RX%d\n",client->receiver); //Start the audio thread if(pthread_create(&receiver[client->receiver].audio_thread_id,NULL,audio_thread,client)!=0) { fprintf(stderr,"Failed to create audio thread for rx %d\n",client->receiver); exit(1); } return OK; } else if(strcmp(token,"bandscope")==0) { //COMMAND: 'start bandscope <port#>' token=strtok(NULL," \r\n"); if(token!=NULL) { client->bs_port=atoi(token); } attach_bandscope(client); return OK; } else { // invalid command string return INVALID_COMMAND; } } else { // invalid command string return INVALID_COMMAND; } } else if(strcmp(token,"stop")==0) { //COMMAND: 'stop <stream>' token=strtok(NULL," \r\n"); if(token!=NULL) { if(strcmp(token,"iq")==0) { //COMMAND: 'stop iq' token=strtok(NULL," \r\n"); if(token!=NULL) { client->iq_port=-1; } return OK; } else if(strcmp(token,"bandscope")==0) { //COMMAND: 'stop bandscope' client->bs_port=-1; detach_bandscope(client); } else { // invalid command string return INVALID_COMMAND; } } else { // invalid command string return INVALID_COMMAND; } } else if(strcmp(token,"preamp")==0) { return NOT_IMPLEMENTED_COMMAND; } else if(strcmp(token,"record")==0) { return NOT_IMPLEMENTED_COMMAND; } else if(strcmp(token,"mox")==0) { return NOT_IMPLEMENTED_COMMAND; } else if(strcmp(token,"ocoutput")==0) { return NOT_IMPLEMENTED_COMMAND; } else { // invalid command string return INVALID_COMMAND; } } else { // empty command string return INVALID_COMMAND; } return INVALID_COMMAND; }
const char* parse_command(CLIENT* client,char* command) { char* token; fprintf(stderr,"parse_command(Rx%d): '%s'\n",client->receiver_num,command); token=strtok(command," \r\n"); if(token!=NULL) { if(strcmp(token,"attach")==0) { //COMMAND: 'attach <side>' token=strtok(NULL," \r\n"); if(token!=NULL) { //COMMAND: 'attach rx#' int rx=atoi(token); const char *resp=attach_receiver(rx,client); if (strcmp(resp, "Error") == 0) return resp; else return attach_transmitter(client, resp); } } else if(strcmp(token,"detach")==0) { //COMMAND: 'detach <side>' token=strtok(NULL," \r\n"); if(token!=NULL) { int rx=atoi(token); return detach_receiver(rx,client); } else { return INVALID_COMMAND; } } else if(strcmp(token,"frequency")==0) { //COMMAND: 'frequency <long freq>' token=strtok(NULL," \r\n"); if(token!=NULL) { long f=atol(token); return set_frequency(client,f); } else { return INVALID_COMMAND; } } else if(strcmp(token,"start")==0) { //COMMAND: 'start <stream> <port#>' token=strtok(NULL," \r\n"); if(token!=NULL) { if(strcmp(token,"iq")==0) { //COMMAND: 'start iq <port#>' token=strtok(NULL," \r\n"); if(token!=NULL) { client->iq_port=atoi(token); } //NOTE:as it is now the usrp-server, only receiver 0's is supported //then it is the only one to issue 'start' command. if (usrp_start_rx_forwarder_thread(client)!=0) exit(1); sleep(1); //some settling time... //This is executed only once if (! usrp_is_started()) { if (usrp_start (client)) fprintf(stderr,"Started USRP for Client %d\n",client->receiver_num); else { fprintf(stderr,"USRP threads start FAILED for rx %d\n",client->receiver_num); exit(1); } } sleep(1); //some settling time //Start the server side tx audio stream receiving thread //Exit program if failed (...?) if (start_tx_audio_thread(client)!=0) exit(1); return OK; } else if(strcmp(token,"bandscope")==0) { //COMMAND: 'start bandscope <port#>' token=strtok(NULL," \r\n"); if(token!=NULL) { client->bs_port=atoi(token); } attach_bandscope(client); return OK; } else { // invalid command string return INVALID_COMMAND; } } else { // invalid command string return INVALID_COMMAND; } } else if(strcmp(token,"stop")==0) { //COMMAND: 'stop <stream>' token=strtok(NULL," \r\n"); if(token!=NULL) { if(strcmp(token,"iq")==0) { //COMMAND: 'stop iq' token=strtok(NULL," \r\n"); if(token!=NULL) { client->iq_port=-1; } return OK; } else if(strcmp(token,"bandscope")==0) { //COMMAND: 'stop bandscope' client->bs_port=-1; detach_bandscope(client); } else { // invalid command string return INVALID_COMMAND; } } else { // invalid command string return INVALID_COMMAND; } } else if(strcmp(token,"mox")==0) { //Toggle the mox int v=toggle_mox(client); fprintf(stderr,"Toggled mox to %d for Client %d\n",v, client->receiver_num); return OK; } else if(strcmp(token,"preamp")==0) { return NOT_IMPLEMENTED_COMMAND; } else if(strcmp(token,"record")==0) { return NOT_IMPLEMENTED_COMMAND; } else if(strcmp(token,"ocoutput")==0) { return NOT_IMPLEMENTED_COMMAND; } else { // invalid command string return INVALID_COMMAND; } } // empty command string return INVALID_COMMAND; }