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; }
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); }
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); }
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; }
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); } }