Ejemplo n.º 1
0
message_t * message_recv(int fd){
	
	message_t *msg = NULL;
	char buffer[CHARCOAL_MSG_SIZE];
    int recv_num;
    
    // Clear buffer
    bzero(buffer,CHARCOAL_MSG_SIZE);
    
    // Block on read
    recv_num = read(fd,buffer,CHARCOAL_MSG_SIZE);
    
    if (recv_num < 0)
    {
        logger_log(LOG_ERROR, "failed reading from socket, %s", strerror(errno));
        // Will create a undefined message
        msg = message_decode(NULL);

        
    } else {
       logger_log(LOG_DEBUG, "[charcoal message] message type: %d", buffer[0]);
        msg = message_decode(buffer);

    }
    
    return msg;
}
Ejemplo n.º 2
0
END_TEST


START_TEST(test_message_encode)
{
  message * msg;
  char * res;
  uint32_t len;

  msg = message_create_echo(MESSAGE_TYPE_REQUEST, "hey");
  ck_assert_int_eq(message_encode(msg, &res, &len), 0);
  ck_assert_int_eq(len, 7);
  ck_assert_int_eq(memcmp(res, "\x93\x00\x01\xa3hey", len), 0);
  msg = message_decode("\x93\x00\x01\xa3hey", 7);
  ck_assert(msg != NULL);
  ck_assert_str_eq(msg->data.echo, "hey");

  msg = message_create_echo(MESSAGE_TYPE_RESPONSE, "hey");
  ck_assert_int_eq(message_encode(msg, &res, &len), 0);
  ck_assert_int_eq(len, 7);
  ck_assert_int_eq(memcmp(res, "\x93\x01\x01\xa3hey", len), 0);
  msg = message_decode("\x93\x01\x01\xa3hey", 7);
  ck_assert(msg != NULL);
  ck_assert_str_eq(msg->data.echo, "hey");

  msg = message_create_identity(MESSAGE_TYPE_REQUEST, NULL, 0);
  ck_assert_int_eq(message_encode(msg, &res, &len), 0);
  ck_assert_int_eq(len, 4);
  ck_assert_int_eq(memcmp(res, "\x93\x00\x00\xc0", len), 0);

  msg = message_create_identity(MESSAGE_TYPE_RESPONSE, "localhost", 10000);
  ck_assert_int_eq(message_encode(msg, &res, &len), 0);
  ck_assert_int_eq(len, 17);
  ck_assert_int_eq(memcmp(res, "\x93\x01\x00\x92\xa9localhost\xcd'\x10", len), 0);
  msg = message_decode("\x93\x01\x00\x92\xa9localhost\xcd'\x10", 17);
  ck_assert(msg != NULL);
  /* ck_assert_int_eq(msg->data.identity.port , 10000); */
  /* ck_assert_str_eq(msg->data.identity.name, "localhost"); */

  msg = message_create(MESSAGE_TYPE_REQUEST, MESSAGE_ACTION_DISCOVER);
  ck_assert_int_eq(message_encode(msg, &res, &len), 0);
  ck_assert_int_eq(len, 4);
  ck_assert_int_eq(memcmp(res, "\x93\x00\x02\xc0", len), 0);
  msg = message_decode("\x93\x00\x02\xc0", 4);
  ck_assert(msg != NULL);
  ck_assert_int_eq(msg->type, MESSAGE_TYPE_REQUEST);
  ck_assert_int_eq(msg->action, MESSAGE_ACTION_DISCOVER);


}
Ejemplo n.º 3
0
void* handle_request(void *tData) {
	listener_thread_data *thread_info = (listener_thread_data *)(tData);
	RC_t rc;
	payloadBuf *packet;

	do {
		rc = message_decode(thread_info->socket, &packet);
		if (rc != RC_SUCCESS) {
			break;
		}
		processPacket(thread_info->socket, packet, NULL);
	}while(1);

	pthread_testcancel();
	thread_info->state = 0;
	pthread_exit(NULL);
}
Ejemplo n.º 4
0
RC_t get_topology() {	
	struct sockaddr_in master;
	struct Node* node;
	int mSocket, numIPs, nodeFound, i;
	payloadBuf *packet;
	RC_t rc;

	printf("Contacting admission control to join group\n");
	
	if((mSocket = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) {
		printf("Unable to create socket. Dying...\n");
		//exit(0);
                return RC_FAILURE;
	}
        printf("\nAfter socket\n");	
	memset(&master, 0, sizeof(master));
	master.sin_family 	= AF_INET;
	master.sin_addr.s_addr 	= inet_addr(ADMISSION_CONTACT_IP);
	master.sin_port		= htons(ADMISSION_CONTACT_PORT);

	//First get my IPAddress so that we can get the pointer to it
	//numIPs = getMyIPAddrs(myIPs);
	
	if((connect(mSocket, (struct sockaddr *)&master, sizeof(master))) < 0) {
		printf("Unable to connect with the Master. Dying...\nPress any key to continue");
	        getchar();
                return RC_FAILURE;
        }
		
	//Tell the master I want to join the topology
	
	sendTopologyJoinRequest(mSocket);
                
	rc = message_decode(mSocket,&packet);
	printf("\nAfter message decode\n");	

        processPacket(mSocket, packet);
	
	//process the incoming packet	
			
	
	//Set the topology version received from master.
	//Get a pointer to the node containing my IP. Set it to *myself.
	
	nodeFound = 0;
	node = server_topology->node;
	do {
		
		if(!strcmp(node->IP, myIP)) {
		    nodeFound = 1;
		    break;	
                }					
		node = node->next;	
	}while(node != server_topology->node);
	
	if(nodeFound)	
		myself = node;
	else { 
		LOG(ERROR, "My IP not found in server topology%s\n","");
		return RC_FAILURE;	
	}
	//By this time, topology is formed and is present in the server_topology pointer
	//Any changes in the topology will cause a change in the version number of the topology
	
	printf("Received topology from admission control\n");	
	return RC_SUCCESS;
}
Ejemplo n.º 5
0
int main() {

	int listenSocket, connectSocket, socketFlags, ret, clientSize;
	struct sockaddr_in myAddress, clientAddress;
	int i,j, bytes, numBytes, pid;
	server_topology = NULL;

	log_init();
        getIpAddr();	
	//server_topology = (struct Head_Node*)calloc(1, sizeof(struct Head_Node));
	
	payloadBuf *packet;
	int rc;
	
	clientSize = sizeof(clientAddress);

	//Create a listening socket..
	if((listenSocket = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
		printf("Error creating server socket. Dying ...\n");
		return 0;
	}
	printf("Socket Created\n");
	
	//Init the sockaddr structure..
	memset(&myAddress, 0, sizeof(myAddress));
	myAddress.sin_family	  = AF_INET;
	myAddress.sin_addr.s_addr = INADDR_ANY;
	myAddress.sin_port	  = htons(MY_PORT);
	
	
	//Now bind the socket..
	if((bind(listenSocket, (struct sockaddr *)&myAddress, sizeof(myAddress))) < 0) {
		printf("Error binding socket. Dying...\n");		
		return 0;
	}

	printf("Bind Created\n");
	
	//Listen on the socket for incoming connections..	
	if((listen(listenSocket, 10)) < 0) {
		printf("Error listening on socket. Dying...\n");
		return 0;
	}
	
	printf("Now listening\n");
	for(;;) {
		if ((connectSocket = accept(listenSocket, (struct sockaddr*)&clientAddress, &clientSize)) < 0) {
			printf("Error accepting connection. Dying...\n");
			return 0;
		} 
		
		printf("Before printing\n");
		
		
		printf("\nClient %d.%d.%d.%d connected\n", 
				(clientAddress.sin_addr.s_addr & 0xFF),  
				(clientAddress.sin_addr.s_addr & 0xFF00) >> 8,  
				(clientAddress.sin_addr.s_addr & 0xFF0000) >> 16,  
				(clientAddress.sin_addr.s_addr & 0xFF000000) >> 24 
			);
		
		//A client has connected.
		//I need to tell the topology to the client
		
		printf("Calling Message Decode\n");	
		rc = message_decode(connectSocket, &packet);
		printf("After message decode\n");
		if(rc == RC_SUCCESS)
			processPacket(connectSocket, packet);	
	
		
		//Now I need to tell other that a new node is about to join. 
		//First tell the nodes neigbors	
		close(connectSocket);
		
	}	
}