int c_brem(w_coord wcoord, b_coord bcoord) { server_socket *dst; n_coord ncoord; void *p; lt_packet out_packet; client_func_checks(); ncoord = wcoord_to_ncoord(wcoord); dst = find_neighbor(ncoord); if (!dst) return 0; makepacket(&out_packet, T_BREM); p = &out_packet.payload; if (!put_wx(&p, wcoord.x, &PLength(&out_packet), &PArgc(&out_packet))) return 1; if (!put_wy(&p, wcoord.y, &PLength(&out_packet), &PArgc(&out_packet))) return 1; if (!put_wz(&p, wcoord.z, &PLength(&out_packet), &PArgc(&out_packet))) return 1; if (!put_bx(&p, bcoord.x, &PLength(&out_packet), &PArgc(&out_packet))) return 1; if (!put_by(&p, bcoord.y, &PLength(&out_packet), &PArgc(&out_packet))) return 1; if (!put_bz(&p, bcoord.z, &PLength(&out_packet), &PArgc(&out_packet))) return 1; return (sendpacket(dst, &out_packet)); }
int c_lusers() { lt_packet out_packet; client_func_checks(); makepacket(&out_packet, T_LUSERS); return (sendpacket(neighbor_table[1][1][1], &out_packet)); }
int c_p_empty(void) { lt_packet out_packet; client_func_checks(); makepacket(&out_packet, T_P); return (sendpacket(neighbor_table[1][1][1], &out_packet)); }
int c_sc(int32_t csid) { void *p; lt_packet out_packet; client_func_checks(); makepacket(&out_packet, T_SC); p = &out_packet.payload; if (!put_csid(&p, csid, &PLength(&out_packet), &PArgc(&out_packet))) return 1; return (sendpacket(neighbor_table[1][1][1], &out_packet)); }
int c_schat(const char *schat_text) { void *p; lt_packet out_packet; client_func_checks(); makepacket(&out_packet, T_SCHAT); p = &out_packet.payload; if (schat_text) put_chat(&p, schat_text, &PLength(&out_packet), &PArgc(&out_packet)); return sendpacket(neighbor_table[1][1][1], &out_packet); }
int c_pmine(int mining) { void *p; lt_packet out_packet; client_func_checks(); lattice_player.mining = mining ? 1 : 0; makepacket(&out_packet, T_PMINE); p = &out_packet.payload; if (!put_mining(&p, mining ? 1 : 0, &PLength(&out_packet), &PArgc(&out_packet))) return 1; return (sendpacket(neighbor_table[1][1][1], &out_packet)); }
int c_action(const char *action_text) { void *p; lt_packet out_packet; client_func_checks(); makepacket(&out_packet, T_ACTION); p = &out_packet.payload; if (action_text) put_action(&p, action_text, &PLength(&out_packet), &PArgc(&out_packet)); return sendpacket(neighbor_table[1][1][1], &out_packet); }
int c_pc(uint32_t color) { void *p; lt_packet out_packet; client_func_checks(); lattice_player.usercolor = color; makepacket(&out_packet, T_PC); p = &out_packet.payload; if (!put_usercolor(&p, color, &PLength(&out_packet), &PArgc(&out_packet))) return 1; return (sendpacket(neighbor_table[1][1][1], &out_packet)); }
int c_quit(const char *reason) { void *p; lt_packet out_packet; client_func_checks(); makepacket(&out_packet, T_QUIT); p = &out_packet.payload; if (reason) put_quitreason(&p, reason, &PLength(&out_packet), &PArgc(&out_packet)); return sendpacket(neighbor_table[1][1][1], &out_packet); }
int c_ph(hand_hold hand) { void *p; lt_packet out_packet; client_func_checks(); lattice_player.hhold = hand; makepacket(&out_packet, T_PH); p = &out_packet.payload; if (!put_item_id(&p, hand.item_id, &PLength(&out_packet), &PArgc(&out_packet))) return 1; if (!put_item_type(&p, hand.item_type, &PLength(&out_packet), &PArgc(&out_packet))) return 1; return (sendpacket(neighbor_table[1][1][1], &out_packet)); }
int c_pr(head_rot rot) { void *p; lt_packet out_packet; client_func_checks(); lattice_player.hrot = rot; makepacket(&out_packet, T_PR); p = &out_packet.payload; if (!put_xrot(&p, rot.xrot, &PLength(&out_packet), &PArgc(&out_packet))) return 1; if (!put_yrot(&p, rot.yrot, &PLength(&out_packet), &PArgc(&out_packet))) return 1; return (sendpacket(neighbor_table[1][1][1], &out_packet)); }
int c_pchat(uint32_t uid, const char *chat_text) { void *p; lt_packet out_packet; client_func_checks(); makepacket(&out_packet, T_PCHAT); p = &out_packet.payload; if (!put_uid(&p, uid, &PLength(&out_packet), &PArgc(&out_packet))) return 1; if (chat_text) put_chat(&p, chat_text, &PLength(&out_packet), &PArgc(&out_packet)); return sendpacket(neighbor_table[1][1][1], &out_packet); }
int c_bo(w_coord wcoord, b_coord bcoord, int32_t id) { void *p; lt_packet out_packet; client_func_checks(); makepacket(&out_packet, T_BO); p = &out_packet.payload; if (!put_wx(&p, wcoord.x, &PLength(&out_packet), &PArgc(&out_packet))) return 1; if (!put_wy(&p, wcoord.y, &PLength(&out_packet), &PArgc(&out_packet))) return 1; if (!put_wz(&p, wcoord.z, &PLength(&out_packet), &PArgc(&out_packet))) return 1; if (!put_bx(&p, bcoord.x, &PLength(&out_packet), &PArgc(&out_packet))) return 1; if (!put_by(&p, bcoord.y, &PLength(&out_packet), &PArgc(&out_packet))) return 1; if (!put_bz(&p, bcoord.z, &PLength(&out_packet), &PArgc(&out_packet))) return 1; if (!put_boid(&p, id, &PLength(&out_packet), &PArgc(&out_packet))) return 1; return (sendpacket(neighbor_table[1][1][1], &out_packet)); }
int c_p(w_coord wcoord, b_coord bcoord) { server_socket *s; w_coord oldwcoord; int x; int y; int z; n_coord newcenter; void *p; lt_packet out_packet; lattice_message mess; lattice_bump submess; client_func_checks(); oldwcoord = lattice_player.wpos; newcenter = wcoord_to_ncoord(wcoord); if (!find_neighbor(newcenter)) { if (!lattice_player.last_p_oob) { mess.type = T_BUMP; ClrFlagFrom(&mess); mess.fromuid = 0; mess.length = sizeof submess; mess.args = &submess; submess.wcoord = lattice_player.wpos; submess.bcoord = lattice_player.bpos; submess.bad_wcoord = wcoord; submess.bad_bcoord = bcoord; (*gcallback)(&mess); } lattice_player.last_p_oob = 1; return 0; } lattice_player.last_p_oob = 0; lattice_player.wpos = wcoord; lattice_player.bpos = bcoord; if (user_is_within_outer_border(lattice_player.wpos, lattice_player.centeredon)) { // we are within the centered servers outer border for (x=0;x<3;x++) for (y=0;y<3;y++) for (z=0;z<3;z++) { if ((s=neighbor_table[x][y][z])) { if (user_is_within_outer_border(lattice_player.wpos, s->coord)) { // we need to relay the P makepacket(&out_packet, T_P); p = &out_packet.payload; if (!put_wx(&p, wcoord.x, &PLength(&out_packet), &PArgc(&out_packet))) return 1; if (!put_wy(&p, wcoord.y, &PLength(&out_packet), &PArgc(&out_packet))) return 1; if (!put_wz(&p, wcoord.z, &PLength(&out_packet), &PArgc(&out_packet))) return 1; if (!put_bx(&p, bcoord.x, &PLength(&out_packet), &PArgc(&out_packet))) return 1; if (!put_by(&p, bcoord.y, &PLength(&out_packet), &PArgc(&out_packet))) return 1; if (!put_bz(&p, bcoord.z, &PLength(&out_packet), &PArgc(&out_packet))) return 1; sendpacket(s, &out_packet); //sendto_one(s, "P %d %d %d %d %d %d\n", wcoord.x, wcoord.y, wcoord.z, bcoord.x, bcoord.y, bcoord.z); } else { // need to ENDP if we are walking away if (user_is_within_outer_border(oldwcoord, s->coord)) { makepacket(&out_packet, T_ENDP); sendpacket(s, &out_packet); //sendto_one(s, "ENDP\n"); } } } } } else { // we need to recenter to the neighboring server packet_recenter_neighbors(newcenter); } return 0; }
int main(int argc,char *argv[]) { FILE *rm; char *save; char *tokens; int timeval; unsigned int packetsize=0; int x,y; char buffer[5000]; char recvbuffer[68]; char str[20]; char filename[30]; int sockfd; struct addrinfo hints, *servinfo, *p; void *addr; int rv; int numbytes; int rvdbytes; struct sockaddr_storage their_addr; socklen_t addr_len; char ipstr[INET6_ADDRSTRLEN]; char s[INET6_ADDRSTRLEN]; fd_set master; fd_set readfds; int mm,sel; struct sockaddr_in b; char arg1[10],arg2[10],arg3[30],arg4[5],arg5[5]; //for sscanf uint16_t cost; int16_t recvdonemorepacket; struct token pc[50]; //for strtok struct details neigh[10]; //to store neighbour details struct message revddata[10]; //structure to store the message struct message sendmsg[10]; // structure to send the message struct dv dv1[10]; //to maintain the routing table //getting the timout value from the startup command timeval=atoi(argv[4]); //initialising for(x=0;x<=4;x++) { dv1[x].cost=0xffff; neigh[x].cost=0xffff; neigh[x].expire=3*timeval; sendmsg[x].h=0x0; } if(argc<5) { fflush(stdout); printf("please follow the syntax \n"); return 1; } if((strcmp(argv[1],"-t") != 0) && (strcmp(argv[3],"-i") != 0)) { fflush(stdout); printf("please specify the update interval \n"); return 1; } //reading topology file strcpy(filename,argv[2]); rm = fopen(filename, "r"); if(rm<=0) { fflush(stdout); printf("error opening the file \n"); } while (!feof(rm)) { fread(buffer, 1, (sizeof buffer)-1, rm); tokens = strtok_r(buffer, " \n", &save); int count = 0; while (tokens != NULL) { strcpy(str,tokens); strcpy(pc[count].arguments,tokens); count++; tokens = strtok_r(NULL, " \n", &save); } } //copying from topology file to variables dv1[0].n=atoi(pc[0].arguments); dv1[0].nongh = atoi(pc[1].arguments); neigh[0].id = atoi(pc[2].arguments); inet_pton(AF_INET,pc[3].arguments,&b.sin_addr); memcpy(&neigh[0].nip,&b.sin_addr,sizeof(b.sin_addr)); neigh[0].nport = atoi(pc[4].arguments); neigh[1].id = atoi(pc[5].arguments); inet_pton(AF_INET,pc[6].arguments,&b.sin_addr); memcpy(&neigh[1].nip,&b.sin_addr,sizeof(b.sin_addr)); neigh[1].nport = atoi(pc[7].arguments); neigh[2].id = atoi(pc[8].arguments); neigh[2].nip= atoi(pc[9].arguments); inet_pton(AF_INET,pc[9].arguments,&b.sin_addr); memcpy(&neigh[2].nip,&b.sin_addr,sizeof(b.sin_addr)); neigh[2].nport = atoi(pc[10].arguments); neigh[3].id = atoi(pc[11].arguments); inet_pton(AF_INET,pc[12].arguments,&b.sin_addr); memcpy(&neigh[3].nip,&b.sin_addr,sizeof(b.sin_addr)); neigh[3].nport = atoi(pc[13].arguments); neigh[4].id = atoi(pc[14].arguments); inet_pton(AF_INET,pc[15].arguments,&b.sin_addr); memcpy(&neigh[4].nip,&b.sin_addr,sizeof(b.sin_addr)); neigh[4].nport= atoi(pc[16].arguments); //initialised neigh[0].updatefields=dv1[0].n; dv1[0].hopto =neigh[0].id; dv1[1].hopto =neigh[1].id; dv1[2].hopto =neigh[2].id; dv1[3].hopto =neigh[3].id; dv1[4].hopto =neigh[4].id; //cost int i=0; for(i=0;i<=4;i++) { if((neigh[i].id == atoi(pc[17].arguments)) || (neigh[i].id == atoi(pc[20].arguments)) || (neigh[i].id == atoi(pc[23].arguments)) || (neigh[i].id == atoi(pc[26].arguments))||(neigh[i].id == atoi(pc[29].arguments))) { neigh[i].cost=0; dv1[0].presentnode=neigh[i].id; dv1[0].presentip=neigh[i].nip; } if(neigh[i].id == atoi(pc[18].arguments)) { neigh[i].cost = atoi(pc[19].arguments); } if(neigh[i].id == atoi(pc[21].arguments)) { neigh[i].cost = atoi(pc[22].arguments); } if(neigh[i].id == atoi(pc[24].arguments)) { neigh[i].cost = atoi(pc[25].arguments); } if (neigh[i].id == atoi(pc[27].arguments)) { neigh[i].cost = atoi(pc[28].arguments); } if (neigh[i].id == atoi(pc[30].arguments)) { neigh[i].cost = atoi(pc[31].arguments); } }//for //cpoying the details to the distance vector table for(i=0;i<dv1[0].n;i++) { dv1[i].sid=neigh[i].id; dv1[i].cost=neigh[i].cost; dv1[i].ip=neigh[i].nip; dv1[i].port=neigh[i].nport; }//for //reference to beej //socket int portn; int16_t z=0; for(z=0;z<dv1[0].n;z++) { if(dv1[0].presentnode==z) { portn=neigh[z-1].nport; } } char portno[5]; sprintf(portno,"%d",portn); memset(&hints, 0, sizeof hints); hints.ai_family = AF_UNSPEC; // set to AF_INET to force IPv4 hints.ai_socktype = SOCK_DGRAM; hints.ai_flags = AI_PASSIVE; // use my IP if ((rv = getaddrinfo(NULL, portno, &hints, &servinfo)) != 0) { fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv)); return 1; } // loop through all the results and bind to the first we can for(p = servinfo; p != NULL; p = p->ai_next) { if ((sockfd = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) == -1) { perror("listener: socket"); continue; } if (bind(sockfd, p->ai_addr, p->ai_addrlen) == -1) { close(sockfd); perror("listener: bind"); continue; } break; } if (p == NULL) { fprintf(stderr, "listener: failed to bind socket STEP\n"); return 1; } freeaddrinfo(servinfo); for(;;) { FD_ZERO(&master); FD_ZERO(&readfds); FD_SET(sockfd,&master); FD_SET(0,&master); readfds = master; mm=sockfd; struct timeval time; time.tv_sec=timeval; sel = select((mm+1),&master,NULL,NULL,&time); //reference to recitation material //to send an update after every timeout to its neighbouring nodes if(sel < 0) { fprintf(stdout,"\n couldnt select"); fflush(stdout); return 1; } //after timeout if(sel==0) //reference to recitation material { fflush(stdout); printf("\ntimed out"); fflush(stdout); for(i=0;i<dv1[0].n;i++) { if(neigh[i].expire !=0) { neigh[i].expire =neigh[i].expire-timeval; } if(neigh[i].id == dv1[0].presentnode) neigh[i].expire = 0; if(neigh[i].expire == 0 && neigh[i].id != dv1[0].presentnode) { neigh[i].cost = 0xffff; } }//for //copying the neighbour details into the routing table for(i=0;i<dv1[0].n;i++) { dv1[i].sid=neigh[i].id; dv1[i].cost=neigh[i].cost; dv1[i].ip=neigh[i].nip; dv1[i].port=neigh[i].nport; }//for makepacket(dv1,sendmsg,neigh,portn); }//if //if a packet is received if(FD_ISSET(sockfd,&master)) //reference to beej { int rvdbytes; struct sockaddr_storage their_addr; socklen_t addr_len; char s[INET6_ADDRSTRLEN]; addr_len=sizeof(their_addr); addr_len = sizeof their_addr; if ((rvdbytes = recvfrom(sockfd, recvbuffer, sizeof(recvbuffer) , 0,(struct sockaddr *)&their_addr, &addr_len)) == -1) { perror("recvfrom"); exit(1); } else recvdonemorepacket+=1; //deserialization //reference to beej unpack(recvbuffer,"hhllhhhhlhhhhlhhhhlhhhhlhhhh",&revddata[0].noofupdate,&revddata[0].senderport,&revddata[0].senderip,&revddata[0].ip,&revddata[0].port,&revddata[0].h,&revddata[0].id,&revddata[0].cost,&revddata[1].ip,&revddata[1].port,&revddata[1].h,&revddata[1].id,&revddata[1].cost,&revddata[2].ip,&revddata[2].port,&revddata[2].h,&revddata[2].id,&revddata[2].cost,&revddata[3].ip,&revddata[3].port,&revddata[3].h,&revddata[3].id,&revddata[3].cost,&revddata[4].ip,&revddata[4].port,&revddata[4].h,&revddata[4].id,&revddata[4].cost); //to display the received message on the receiver side for(i=0;i<dv1[0].n;i++) { if(neigh[i].nip==revddata[0].senderip) { fflush(stdout); printf("\n RECEIVED A MESSAGE FROM SERVER <%d>",neigh[i].id); neigh[i].expire=3*timeval; } int j=0; for(j=0;j<dv1[0].n;j++) { if(revddata[0].senderip==neigh[i].nip) { if(dv1[0].presentip == neigh[j].nip) { if(neigh[i].cost>revddata[j].cost) neigh[i].cost = revddata[j].cost; }//if }//if i }//for j }//for i //copying the neigh details to the distance vector for(i=0;i<dv1[0].n;i++) { dv1[i].sid=neigh[i].id; dv1[i].cost=neigh[i].cost; dv1[i].ip=neigh[i].nip; dv1[i].port=neigh[i].nport; }//for updaterouting(dv1,sendmsg,revddata,neigh); }//fdisset sock else if(sel>0) //reference to beej { //user command if(FD_ISSET(0,&master)) { fflush(stdin); fgets(buffer,150,stdin); sscanf(buffer,"%s %s %s %s %s",arg1,arg2,arg3,arg4,arg5); fflush(stdout); if(strcmp(arg1,"update") == 0) { char prst[5]; char st[INET6_ADDRSTRLEN]; struct sockaddr_in g; char portno[5]; sprintf(prst,"%d",dv1[0].presentnode); if(strcmp(prst,arg2)==0) { int i=0; for(i=0;i<dv1[0].n;i++) { char nei[5]; int16_t packetsize=0; int16_t h=0x0; sprintf(nei,"%d",neigh[i].id); if(strcmp(nei,arg3)==0 && neigh[i].cost != 0xffff) { uint8_t bufr[68]; if(strcmp(arg4,"inf")==0 || strcmp(arg4,"INF")==0 ) neigh[i].cost=0xffff; else neigh[i].cost=atoi(arg4); packetsize=pack(bufr,"hhllhhhhlhhhhlhhhhlhhhhlhhhh",neigh[0].updatefields,portn,dv1[0].presentip,neigh[0].nip,neigh[0].nport,h,neigh[0].id,neigh[0].cost,neigh[1].nip,neigh[1].nport,h,neigh[1].id,neigh[1].cost,neigh[2].nip,neigh[2].nport,h,neigh[2].id,neigh[2].cost,neigh[3].nip,neigh[3].nport,h,neigh[3].id,neigh[3].cost,neigh[4].nip,neigh[4].nport,h,neigh[4].id,neigh[4].cost); //reference to beej memcpy(&g.sin_addr,&neigh[i].nip,sizeof(details)); inet_ntop(AF_INET,&g.sin_addr,st,INET_ADDRSTRLEN); //reference to beej //UDP socket to send packets sprintf(portno,"%d",neigh[i].nport); memset(&hints, 0, sizeof hints); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_DGRAM; if ((rv = getaddrinfo(st, portno, &hints, &servinfo)) != 0) { fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv)); return 1; } // loop through all the results and make a socket for(p = servinfo; p != NULL; p = p->ai_next) { if ((sockfd = socket(p->ai_family, p->ai_socktype,p->ai_protocol)) == -1) { perror("talker: socket"); continue; } break; } if (p == NULL) { fprintf(stderr, "talker: failed to bind socket STEP\n"); return 2; } if ((numbytes = sendto(sockfd, bufr, sizeof(bufr), 0,p->ai_addr, p->ai_addrlen)) == -1) { perror("talker: sendto"); exit(1); } else{ fflush(stdout); printf("update SUCCESS \n"); } }// ifarg3 }//for for(i=0;i<dv1[0].n;i++) { if(atoi(arg3) == neigh[i].id) { if(neigh[i].cost == 0xffff){ fflush(stdout); printf(" \n UPDATE server is not my neighbour %d \n",neigh[i].id); } } } }//if arg2 //copying the neigh details to the distance vector for(i=0;i<dv1[0].n;i++) { dv1[i].sid=neigh[i].id; dv1[i].cost=neigh[i].cost; dv1[i].ip=neigh[i].nip; dv1[i].port=neigh[i].nport; }//for }//if update if(strcmp(arg1,"step")==0) { makepacket(dv1,sendmsg,neigh,portn); fflush(stdout); printf("\n step SUCCESS"); if(arg2 !=0) printf("\n 'step' please follow the command format"); //sendupdate(); } if(strcmp(arg1,"display")==0) {printf("\nid\tdest\thop\tcost\t\n"); for(i=0;i<dv1[0].n;i++) { fflush(stdout); printf("\n%d\t%d\t%d\t%d\t\n",dv1[0].presentnode,dv1[i].sid,dv1[i].hopto,dv1[i].cost); } fflush(stdout); printf("display SUCCESS \n"); } if(strcmp(arg1,"crash")==0) { fflush(stdout); printf("\n CRASH SUCCESS \n"); close(sockfd); } if(strcmp(arg1,"disable")==0) { for(i=0;i<dv1[0].n;i++) { if(atoi(arg2)==neigh[i].id) { neigh[i].cost=0xffff; } }//for //copying the neighbour details t the distance vector table for(i=0;i<dv1[0].n;i++) { dv1[i].sid=neigh[i].id; dv1[i].cost=neigh[i].cost; dv1[i].ip=neigh[i].nip; dv1[i].port=neigh[i].nport; }//for fflush(stdout); printf("\n disable SUCCESS \n"); if((atoi(arg2)!=neigh[0].id) && (atoi(arg2)!=neigh[1].id) && (atoi(arg2)!=neigh[2].id) && (atoi(arg2)!=neigh[3].id) && (atoi(arg2)!=neigh[4].id) && (atoi(arg2)!=neigh[5].id)) { fflush(stdout); printf("\n the server id is not my neighbour DISABLE \n"); } }//disable if(strcmp(arg1,"packets")==0) { fflush(stdout); printf("\npackets received %d",recvdonemorepacket); fflush(stdout); printf("\n PACKETS SUCCESS \n"); if(recvdonemorepacket == 0) { fflush(stdout); printf("\n PACKETS No packets have been received \n"); } recvdonemorepacket=0; } }//STDIN }//sel }//infinite loop return 0; }