Commit 7a2dcaca authored by Bhavesh Yadav's avatar Bhavesh Yadav

Added chord.c and chord.h

parent 1ce65068
#include<stdlib.h>
#include<stdio.h>
#include<stdbool.h>
#include<string.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#define MAXLOCATIONS 32
int keyToId(char * key){
//To be filled
}
int nodeToId(char ip[], int port){
//To be filled
int id = 1;
return id;
}
typedef struct Node
{
int nodeId;
char ip[16];
}Node;
typedef struct Finger
{
int nextId;
int nextNodeId;
char ip[16];
}Finger;
typedef struct Chord
{
int* finger;
int selfId;
char selfIp[16];
int selfPort;
int successor;
char successorIp[16];
int successorPort;
int predecessor;
char predecessorIp[16];
int predecessorPort;
}Chord;
Chord chord;
void sendUDP(char * msg, char ip[], int port, bool recvResponse, char * buffer)
{
int sockfd;
struct sockaddr_in servaddr;
// Creating socket file descriptor
if ( (sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0 ) {
perror("socket creation failed");
exit(EXIT_FAILURE);
}
memset(&servaddr, 0, sizeof(servaddr));
// Filling server information
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(port);
servaddr.sin_addr.s_addr = inet_addr(ip);
int n, len;
sendto(sockfd, (const char *)msg, strlen(msg),
MSG_CONFIRM, (const struct sockaddr *) &servaddr,
sizeof(servaddr));
if (recvResponse)
{
n = recvfrom(sockfd, (char *)buffer, 1000,
MSG_WAITALL, (struct sockaddr *) &servaddr,
&len);
buffer[n] = '\0';
}
close(sockfd);
}
void initChordStructure(char * joinIp){
chord.finger = (Finger *) malloc(log(MAXLOCATIONS)*sizeof(Finger));
char ip[16] = getip();
int port =4;
strcpy(chord.selfIp ,ip);
chord.selfId = nodeToId(ip,port);
chord.predecessor =-1;
if (joinIp==NULL)
{
chord.successor = chord.selfId;
}
else
{
/* send find successor packet to the ip */
// Listen for reply
// update successor
}
}
void closestPreceedingNode(int id, char ip[]){
int m= log(MAXLOCATIONS);
Finger* f=chord.finger;
for (int i = m-1; i >=0; i--)
{
int nextId = f[m].nextId;
if (nextId>chord.selfId && nextId<=id)
{
strcpy(ip,f[m].ip);
return;
}
}
strcpy(ip,f[0].ip); //????
}
Node findSuccessor(int id, char ip[], int port, bool block){
Node n;
n.nodeId=-1;
if (id>=chord.selfId && id<=chord.successor)
{
n.nodeId=chord.selfId;
strcpy(n.ip,chord.selfIp);
if (block)
{
}
else
{
return n;
}
}
else
{
char preceedingIp[16];
closestPreceedingNode(id,preceedingIp);
char msg[1000],buffer[1000];
//make_packet and send
sendUDP(msg,ip,port,true,buffer);
return n;
}
}
void sendPredecessor(char ip[], int port){
int sockfd;
char msg[1000];
ToXML(msg,ip,port);//TO be changed
sendUDP(msg,ip,port,false,NULL);
}
void stabilize(){
char msg[1000],buffer[1000];
sendUDP(msg,chord.successorIp,chord.successorPort,true,buffer);
}
void sendPredecessor();
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment