Exemple #1
0
Fichier : hw4.c Projet : lfcmpi/UIC
int handle_command(char* cmd, struct client_state* client) {
	char temp_name[255];
	char message[255];
  char recipient[255];
	char send_msg[500];

	if(sscanf(cmd, "name %s\r\n", temp_name)) {
		
		sprintf(send_msg, "%s set name to %s\n", client->name, temp_name);
		printf("%s",send_msg);		
		strcpy(client->name, temp_name);

		broadcast_msg(send_msg, client);
	}	
	else if(sscanf(cmd, "say %[^\r\n]", message)) {		
		printf("%s said: %s\n",client->name,message);

		sprintf(send_msg, "%s> %s\n", client->name, message);
		broadcast_msg(send_msg,client);
	}
	else if(sscanf(cmd, "whisper %[^ ] %[^\r\n]", recipient, message)==2) {		
		printf("%s whispered to %s: %s\n",client->name,recipient,message);

		sprintf(send_msg, "~%s> %s\n", client->name, message);
		unicast_msg(send_msg,recipient);
	}
}
Exemple #2
0
int run()
{
	timer_srv.reset(new boost::asio::io_service());
	the_net.reset(new net_server<koko_socket>(2));

	boost::system::error_code ec;
	the_config.load_from_file();

	db_.reset(new utf8_data_base(the_config.accdb_host_, the_config.accdb_user_,the_config.accdb_pwd_, the_config.accdb_name_));
	if(!db_->grabdb()){
		glb_log.write_log("database start failed!!!!");
		return -1;
	}

	db_delay_helper_[0].set_db_ptr(db_);

	if (start_network() != 0){
		goto _EXIT;
	}

	{
		boost::shared_ptr<boost::thread> td(new boost::thread(boost::bind(db_thread_func, db_delay_helper_)));
		cache_persistent_threads.push_back(td);
	}

	int idle_count = 0;

	task_on_5sec* ptask = new task_on_5sec(*timer_srv);
	task.reset(ptask);
	ptask->schedule(1000);
	ptask->routine();
	while(!glb_exit)
	{
		bool busy = false;
		
		timer_srv->reset();
		timer_srv->poll();
		
		the_net->ios_.reset();
		the_net->ios_.poll();

		handle_pending_logins();

		pickup_player_msgs(busy);
		handle_player_msgs();

		update_players();

		smsg_ptr pmsg;
		broadcast_msg_.pop_front(pmsg);
		if(pmsg.get())
			broadcast_msg(pmsg);

		boost::posix_time::milliseconds ms(20);
		boost::this_thread::sleep(ms);
	}

_EXIT:
	return 0;
}
void* IpStreamReceiverTask(void* _context){
	struct Context* context = (struct Context*)_context;
	unsigned char *dataPtr, name_id[SENDERNAMESIZE] = {context->task_id,UNUSED,UNUSED};
	unsigned char *buffer;
	char printbuffer[DATASIZE];
	int len;


	puts("SReceiverTask: Started");

	while(communication_needed) {
		buffer = (unsigned char *)calloc(1, DATASIZE);
		dataPtr = buffer;

		buffer[0]=0xFF;
		if(sslegacymode) {len  = use_ipstream_server( "RESV" , buffer+2 , 1);
						buffer[1] = len;
						if (len < 0) break;
						}
		else 				 len = use_ipstream_server( "RESV" , buffer+2 , 1);



		printf("SReceiverTask: data from serial port [%s]\n", binary_to_hexbinaryString(dataPtr,dataPtr[1]+2,printbuffer));

		printf("SReceiverTask: Sender: [%s]\n", binary_to_hexbinaryString(name_id,SENDERNAMESIZE,printbuffer));


		puts("broadcast: SReceiverTask");
		broadcast_msg(name_id, Out1, dataPtr);

	}

    return NULL;
}
int ethernet_demuxer (mach_msg_header_t *inp,
		      mach_msg_header_t *outp)
{
  struct net_rcv_msg *msg = (struct net_rcv_msg *) inp;

  if (inp->msgh_id != NET_RCV_MSG_ID)
    return 0;

  broadcast_msg (msg);
  /* The data from the underlying network is inside the message,
   * so we don't need to deallocate the data. */
  return 1;
}
static void search_ipcam(void)
{
	int ret;
	struct ipcam_search_msg send_msg;

	memset(&send_msg, 0, sizeof(send_msg));
	send_msg.type = 0x4;
	send_msg.ssrc = SSRC;
	ret = broadcast_msg(IPCAM_SERVER_PORT, &send_msg, sizeof(send_msg));
	if (ret < 0)
		debug_print("fail: sendto return %d", ret);

	return;
}
Exemple #6
0
/**
Thread function that handles an individual client
**/
void * handle_client (void *arg)
{
	int connfd;
	char buffer[MAXMSG];
	int i=0, n;
	while (!quit)
	{
		
	/*read a message from this client*/ 
	connfd = *(int*)arg; 	/*should cast the "connfd_arg" to an integer to use in recv function */ 
	
	/* if EOF quit, otherwise broadcast it using broadcast_msg() */ 
			
	
	n = recv(connfd,buffer,MAXMSG,0);
	
	if(n==0){
		perror("A client has sihned out");
		break;
		}
	
	buffer[n] = 0;
	/** lock the broadcast_msg() function **/
	pthread_mutex_lock(&mutex);
	broadcast_msg(buffer);
	pthread_mutex_unlock(&mutex);	
	
	}
	/* Cleanup resources and free the client_t memory used by this client */
	
	while(i<MAXCLIENTS){
		if(clients[i]!=NULL){
			if(clients[i]->sd==connfd){
				free(clients[i]);
					
				clients[i]=NULL;
				}
			i++;
			}
		}
	perror("Client disconnected");
	close(connfd);
	return NULL;
}
Exemple #7
0
void multiplexer(int listener)
{
	fd_set readfds, masterfd;
	FD_ZERO(&readfds);
	FD_ZERO(&masterfd);
	FD_SET(listener, &masterfd);
	FD_SET(STDIN, &masterfd);
	int fdmax;

	socklen_t addrsize;
	struct sockaddr_storage their_addr;
	int inbytes,  new_fd, var;
	char outmsg[1024], inmsg[1024];
	char incoming_IP[INET6_ADDRSTRLEN]; //Extra size doesn't hurt
	fdmax = listener;
	
	while(1)
	{
		readfds = masterfd;
		if (select(fdmax+1, &readfds, NULL, NULL, NULL) == -1) 
		{
 			perror("select");
 			exit(4);
 		}
 		for(int i=0; i<=fdmax; i++)
		{	
			if(FD_ISSET(i, &readfds))
			{
				if(i==listener)
				{
					addrsize = sizeof their_addr;
					if((new_fd = accept(listener, (struct sockaddr *)&their_addr, &addrsize)) == -1) 
					{
						perror("server: accept error");
					}
					else
					{
						char c[1024];
						FD_SET(new_fd, &masterfd); // add to master set
						if (new_fd > fdmax) 
							fdmax = new_fd;
						inet_ntop(their_addr.ss_family, get_in_addr(&their_addr), incoming_IP, INET6_ADDRSTRLEN);
						printf("Server received a connection from %s on socket %d\n",incoming_IP, new_fd);
						getnick(new_fd, c);
						client_t *cli = (client_t *)malloc(sizeof(client_t));
						cli->connfd = new_fd;
						cli->uid = uid++;
						sprintf(cli->name, "%s", c);
						/* Add client to the queue */
						queue_add(cli);
						var = get_index(new_fd);
						sprintf(outmsg, "%s %s %s", "||| WELCOME",clients[var]->name, "|||\n");
						send_private(new_fd, outmsg);
						sprintf(outmsg, "%s joined the room\n",clients[var]->name);
						printf("%s", outmsg); //display on server
						broadcast_msg(new_fd, outmsg, &masterfd, fdmax, listener);
					}
				}
				else if(i == 0)
			    {
					if(fgets(outmsg, 1023, stdin)==NULL) 
						return ; 
					else
					{	
						char out[1024];
						sprintf(out, "%s %s","[Server] : ", outmsg);
						broadcast_msg(i, out, &masterfd, fdmax, listener);
					}
				}
				else //Only case left is that a client got some data
				{
					var = get_index(i);
					if(readmsg(i, 1023, inmsg))
					{
						printf("[%s] : %s", clients[var]->name, inmsg); //display on server
						sprintf(outmsg, "[%s] : %s",clients[var]->name, inmsg);
						broadcast_msg(i, outmsg, &masterfd, fdmax, listener);
					}
					else
					{
						printf("%s left the room\n", clients[var]->name); //display on server
						sprintf(outmsg, "%s %s",clients[var]->name, "left the room\n");
						broadcast_msg(i, outmsg, &masterfd, fdmax, listener);
						FD_CLR(i, &masterfd);
						close(i);
						queue_delete(i);
					}
				}
			}
		}		
	}
}
// Receives from another IP server and sends reply back
void* IPTask(void* _IP_data_task) {
	struct IP_data* IP_data_task = (struct IP_data*) _IP_data_task;
	struct Context* context = (struct Context*) IP_data_task->ptr_context;
	unsigned char VPS = IP_data_task->VPS, *dataPtr, msgFlag;
	char printbuffer[DATASIZE];

	///////////////////////////////////////
	// task_id needs to be made generic! //
	//name_id[SENDERNAMESIZE] = {IPTask1_id,UNUSED,UNUSED};
	///////////////////////////////////////
	unsigned char name_id[SENDERNAMESIZE] = { context->task_id, UNUSED,UNUSED };

	int server_port = IP_data_task->port;

	printf("IPTask%i: Started\n", VPS);

	// Initialize socket and port
	int s, client;
	unsigned int tmp;
	fd_set fdset;
	struct timeval timer;
	struct sockaddr_in c_addr;
	//unsigned char *pointer;

	if ((s = server_init(server_port)) < 0)
		//return(s);

		FD_ZERO(&fdset);
	FD_SET(s, &fdset);
	timer.tv_sec = 30;
	timer.tv_usec = 0;

	pthread_mutex_lock(context->mutex);
	while (communication_needed) {
		//Wait for IP packet
		if (select(s + 1, &fdset, NULL, NULL, NULL)> 0 ) {
			//#ifdef _DEBUG_VERBOSE
				printf("IPTask%i: SELECT has continued\n",VPS);
				//#endif
				tmp = sizeof(c_addr);
				client = accept(s, (struct sockaddr *)&c_addr, &tmp);
				if (client < 0) {
					printf("FAIL1: %s\n", strerror(errno));
				}

				if (PRINT_STATUS) {
					printf("IPTask%i: client connect from %s\n",VPS,
					inet_ntoa(c_addr.sin_addr));
				}
				usleep(10000);
				if ( (dataPtr = receive_cmd(client, VPS)) != NULL )
				{
					//#ifdef _DEBUG_VERBOSE
				printf("IPTask%i: Got [%s] from receive_cmd (ASCII)\n", VPS,binary_to_hexbinaryString(dataPtr,dataPtr[1]+2,printbuffer));
//#endif

		dataPtr[1] = strlen((char*)dataPtr+2); // TODO remove warning
		// Convert hexbinary to binary if first char is a hexbin char else skip conv
		if( ((0x30 <= dataPtr[2]) &&  (dataPtr[2] <= 0x39)) || (('a' <= dataPtr[2] ) && (dataPtr[2]  <= 'f')) || (('A' <= dataPtr[2]) && (dataPtr[2] <= 'F')))
						{ dataPtr[1] = hexbinary_to_binary( &dataPtr[2], &dataPtr[2]);}

		printf("IPTask%i: Receiving from port %i: [",VPS, server_port);
		printf("%s]\n", binary_to_hexbinaryString(dataPtr,dataPtr[1]+2,printbuffer));
		//printf("IPTask%i: Has data after strcat: [%s]\n",VPS,binary_to_hexbinaryString(dataPtr,dataPtr[1]+2,printbuffer));

		// Pass message on
//#ifdef _DEBUG_VERBOSE
		printf("broadcast: IPTask%i\n",VPS);
//#endif
		broadcast_msg(name_id, Out1, dataPtr);

		// DEBUG: Must wait for receiver to pass data on
		//sleep(1.5);


		// Begin listening on Condition for reply
//#ifdef _DEBUG_VERBOSE
		printf("IPTask%i: calling receive()\n",VPS);
//#endif
		//msgFlag = receive(IPTask1_id, context->condition, context->mutex);
		msgFlag = receive(VPS, context->condition, context->mutex);

		dataPtr = context->holder;
		printf("  *** IPTask%i: Sending on port %i: [%s] ***\n", VPS, server_port, binary_to_hexbinaryString(dataPtr,dataPtr[1]+2,printbuffer));
//#ifdef _DEBUG_VERBOSE
		printf("IPTask%i: received from sender: [%s]\n", VPS, binary_to_hexbinaryString(context->sender,SENDERNAMESIZE,printbuffer));
//#endif


		// Send reply back thru open connection
		// dataPtr+2 to avoid sending the VPS and length

		//if(server_port==MANAGEMENTPORT) IP_send_server_String(client, dataPtr+2, dataPtr[1]);
		//else IP_send_server_hexbinaryString(client, dataPtr+2, dataPtr[1]);
		IP_send_server_hexbinaryString(client, dataPtr+2, dataPtr[1]);
		printf("IPTask%i: ip send server func: \n", VPS);
		}
		else printf("IPTask%i: no data in client \n", VPS);
		// Shutdown connection
		if ((shutdown(client, 0) < 0) || (close(client) < 0)) {
			printf("FAIL2: %s\n", strerror(errno));
		}
	 } // end select
			} // while-end

			// Shutdown listening server
			if (s> 0)
			server_end(s);
			printf("IPTask%i: unlocking mutex and stopping\n",VPS);
			pthread_mutex_unlock(context->mutex);
			return NULL;
		}
Exemple #9
0
int main(int argc, char **argv)
{

	user_chat_box_t user_list[MAX_USERS];
	server_ctrl_t server_shell;
	char arg1[MSG_SIZE];
	char arg2[MSG_SIZE];
	char command[MSG_SIZE];
	int cmd_num;
	char* str_pid;
	char* user_name;
	int k;
	int i;
	int idx;
	/* open non-blocking bi-directional pipes for communication with server shell */

	initialize_users(user_list);
	pipe(server_shell.ptoc);
	pipe(server_shell.ctop);
	fcntl(server_shell.ptoc[0],F_SETFL,O_NONBLOCK);
	fcntl(server_shell.ctop[0],F_SETFL,O_NONBLOCK);

	/* Fork the server shell */	
	pid_t pid = fork();
	if (pid < 0) 
		printf("Fork error.\n");
	else if (pid == 0)
	{
		sprintf(arg1, "%d", server_shell.ptoc[0]);
		sprintf(arg2, "%d", server_shell.ctop[1]);
		if(execl("./shell", "shell", arg1, arg2, "Server", (char *)0) < 0){
			perror("execl error");
		}
	}
		/* 
	 	 * Inside the child.
		 * Start server's shell.
	 	 * exec the SHELL program with the required program arguments.
	 	 */

	/* Inside the parent. This will be the most important part of this program. */

		/* Start a loop which runs every 1000 usecs.
	 	 * The loop should read messages from the server shell, parse them using the 
	 	 * parse_command() function and take the appropriate actions. */
	else 
	{	
		server_shell.pid = pid;
		while (1) 
		{
			/* Let the CPU breathe */
			usleep(1000);
			/* 
		 	 * 1. Read the message from server's shell, if any
		 	 * 2. Parse the command
		 	 * 3. Begin switch statement to identify command and take appropriate action
		 	 *
		 	 * 		List of commands to handle here:
		 	 * 			CHILD_PID
		 	 * 			LIST_USERS
		 	 * 			ADD_USER
		 	 * 			KICK
		 	 * 			EXIT
		 	 * 			BROADCAST 
		 	 */

			/* Fork a process if a user was added (ADD_USER) */
				/* Inside the child */
				/*
			 	 * Start an xterm with shell program running inside it.
			 	 * execl(XTERM_PATH, XTERM, "+hold", "-e", <path for the SHELL program>, ..<rest of the arguments for the shell program>..);
			 	 */
		 	if (read(server_shell.ctop[0], command, MSG_SIZE) > 0)
		 	{
		 		cmd_num = parse_command(command);
		 		switch (cmd_num)
		 		{
		 			case CHILD_PID:
		 				str_pid = extract_name(CHILD_PID, command);
		 				server_shell.child_pid = atoi(str_pid);
		 				break;
		 			case LIST_USERS:
		 				list_users(user_list, server_shell.ptoc[1]);
		 				break;
		 			case ADD_USER:
		 				add_user(user_list, command, server_shell.ptoc[1]);
		 				break;
		 			case KICK:
		 				user_name = extract_name(KICK, command);
		 				if ((idx = find_user_index(user_list, user_name)) == -1)
		 					break;
		 				cleanup_user(idx, user_list);
		 				break;
		 			case EXIT:
		 				cleanup_users(user_list);
		 				cleanup_server(server_shell);
		 				break;
		 			case BROADCAST:
		 				broadcast_msg(user_list, command, server_shell.ptoc[1], "Server");
		 				break;
		 		}
		 		if(cmd_num == EXIT)break;
		 	}
		 	
			/* Back to our main while loop for the "parent" */
			/* 
		 	 * Now read messages from the user shells (ie. LOOP) if any, then:
		 	 * 		1. Parse the command
		 	 * 		2. Begin switch statement to identify command and take appropriate action
		 	 *
		 	 * 		List of commands to handle here:
		 	 * 			CHILD_PID
		 	 * 			LIST_USERS
		 	 * 			P2P
		 	 * 			EXIT
		 	 * 			BROADCAST
		 	 *
		 	 * 		3. You may use the failure of pipe read command to check if the 
		 	 * 		user chat windows has been closed. (Remember waitpid with WNOHANG 
		 	 * 		from recitations?)
		 	 * 		Cleanup user if the window is indeed closed.
		 	 */
		 	int nsize;
		 	for (i = 0; i < MAX_USERS; i++)
		 	{
		 		if (user_list[i].status == SLOT_EMPTY)
					continue;
		 		if ((nsize = read(user_list[i].ctop[0], command, MSG_SIZE)) > 0)
		 		{
			 		cmd_num = parse_command(command);
			 		switch (cmd_num)
			 		{
			 			case CHILD_PID:
			 				str_pid = extract_name(CHILD_PID, command);
			 				user_list[i].child_pid = atoi(str_pid);
			 				break;
			 			case LIST_USERS:
			 				list_users(user_list, user_list[i].ptoc[1]);
			 				break;
			 			case P2P:
			 				send_p2p_msg(i, user_list, command);
			 				break;
			 			case EXIT:
			 				cleanup_user(i, user_list);
			 				break;
			 			case BROADCAST:
			 				broadcast_msg(user_list, command, server_shell.ptoc[1], user_list[i].name);
			 				break;
			 		}
		 		} else if(nsize == 0) {
		 			int status;
		 			if(waitpid(user_list[i].child_pid, &status, WNOHANG) < 0) {
		 				cleanup_user(i, user_list);
		 			}
		 		}
		 	}
		}
	}	/* while loop ends when server shell sees the \exit command */

	return 0;
}
Exemple #10
0
Fichier : hw4.c Projet : lfcmpi/UIC
int main(int argc, char **argv) {	
  int port;	
  if(argc==2) {
		port=atoi(argv[1]);
	}
	setlinebuf(stdout);	
	

	int server_sock = socket(AF_INET, SOCK_STREAM, 0);
	if(server_sock < 0) {
		perror("Creating socket failed: ");
		exit(1);
	}
	
	struct sockaddr_in addr; 	// internet socket address data structure
	addr.sin_family = AF_INET;
	addr.sin_port = htons(port); // byte order is significant
	addr.sin_addr.s_addr = INADDR_ANY; // listen to all interfaces
	
	int res = bind(server_sock, (struct sockaddr*)&addr, sizeof(addr));
	if(res < 0) {
		perror("Error binding to port");
		exit(1);
	}

	int yes=1;
  if (setsockopt(server_sock, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) == -1) {
    perror("setsockopt");
    exit(1);
  }

	/* workaround for funny OS X bug - need to start listening without select */
	res=fcntl(server_sock, F_SETFL, O_NONBLOCK);
  if(res<0) { perror("fcntl"); } 
	if (listen (server_sock, 1) < 0) { perror ("listen"); exit(1); } 
	fcntl(server_sock, F_SETFL, 0);

	/* initializing data structure for select call */
	fd_set readset;
	FD_ZERO(&readset);
	FD_SET(server_sock,&readset);	

	while(1) {
		fd_set rdyset;
		FD_COPY(&readset,&rdyset);
		int rdy = select(FD_SETSIZE,&rdyset,0,0,0);

		/* if the server_sock has a new connection coming in, accept it */
		if(FD_ISSET(server_sock,&rdyset)) {
			int sock;
			struct sockaddr_in remote_addr;
			unsigned int socklen = sizeof(remote_addr); 
			
			sock = accept(server_sock, (struct sockaddr*)&remote_addr, &socklen);
			if(res < 0) { perror("Error accepting connection"); exit(1); }

			/* allocate and initialize new client state */
			struct client_state *state=
				(struct client_state*)malloc(sizeof(struct client_state));
			state->next=clients;
			if(clients)
				clients->prev=state;
			state->prev=0;
			state->message_count=0;
			clients=state;
			state->socket=sock;
			client_count++;

			// added
			sprintf(state->name,"Client %d",client_count);
			printf("Got connection (%s)\n",state->name);
			// added

			/* add new socket to fd_set for select */
			FD_SET(sock,&readset);
		}

		/* if any of the active clients are ready to deliver a message,
			 read it and print it */
		struct client_state *clstate = clients;
		while(clstate) {
			if(FD_ISSET(clstate->socket,&rdyset)) {
				char buf[255];
				memset(buf,0,255);
				int rec_count = recv(clstate->socket,buf,255,0);
				if(rec_count > 0) {
					clstate->message_count++;

					// added
					clstate->byte_count+=rec_count;
					handle_command(buf,clstate);
					// added
				}
				/* if we got nothing, that means the connection is closed */
				else {
					printf("closing connection...\n");
					if(clstate->prev == 0) {
						clients = clstate->next;
						if(clients)
							clients->prev = 0;
					}
					else {
						clstate->prev->next = clstate->next;						
						if(clstate->next) 
							clstate->next->prev = clstate->prev;
					}					
					client_count--;

					// tell the others
					char send_msg[255];
					sprintf(send_msg, "%s disconnected.\n", clstate->name);
					broadcast_msg(send_msg, clstate);
					printf("%s disconnected. A total of %d bytes received from %s.\n",clstate->name, clstate->byte_count, clstate->name);

					// clean up the rest of the state
					shutdown(clstate->socket,SHUT_RDWR);
					close(clstate->socket);						
					FD_CLR(clstate->socket,&readset);
					struct client_state *tofree = clstate;
					clstate = clstate->next;
					free(tofree);					
					continue;
				}
			} // end if(FD_ISSET...
			clstate=clstate->next;
		} // end while
	}
	shutdown(server_sock,SHUT_RDWR);
}