void DataBase::removeContact(const ClientPacket &pack, std::string const &loginContact) { const std::string login = pack.getLogin(); if (login == loginContact) throw AlreadyExist(); if (login == "" || loginContact == "") throw NotExist(); const std::string fname(this->DBDirectory + login.substr(0, 1) + "friends" + this->DBExtension); const std::string cname(this->DBDirectory + loginContact.substr(0, 1) + "data" + this->DBExtension); const std::string lname(this->DBDirectory + login.substr(0, 1) + "data" + this->DBExtension); if (!clients.openFile(cname) || !searchClient(loginContact)) throw NotExist(); if (!clients.openFile(lname) || !searchClient(login)) throw NotExist(); if (!friends.openOCreate(fname)) throw FileError(); std::cout << "Remove Contact !!" << std::endl; std::cout << "Login : "******"LoginContact : " << loginContact << std::endl; if (searchFriend(login, loginContact)) { fpack.erase(); friends << fpack; } }
/* readCodeClient * Descrição: realiza a leitura do código do Cliente inserido pelo usuário, * fazendo a validação do mesmo quanto a ser um número inteiro e * não haver outro código identico já alocado no sistema. */ int readCodeClient(void){ int code; char entry[SIZE_CODE + 2]; while(1){ printf("Codigo: "); fgets(entry, SIZE_CODE + 2, stdin); /*Validação - Somente Inteiros*/ if(validateNumber(entry) == TRUE){ code = convertNumber(entry); /*Verificação - Árvore Vazia*/ if(client_root->root != NULL){ /*Validação - Código Duplicado*/ if(searchClient(&(client_root->root), code) != NULL){ printf("Codigo já cadastrado no sistema. Por favor, insira um novo codigo.\n"); }else{ break; } }else{ break; } } } return code; }
const ClientPacket &DataBase::getClient(const std::string &login) { const std::string filename(this->DBDirectory + login.substr(0, 1) + "data" + this->DBExtension); if (!clients.openOCreate(filename)) throw FileError(); if (!searchClient(login)) throw NotExist(); return (pack); }
const ClientPacket &DataBase::addClient(const std::string &login, const std::string &passwd) { const std::string filename(this->DBDirectory + login.substr(0, 1) + "data" + this->DBExtension); if (!clients.openOCreate(filename)) throw FileError(); if (searchClient(login)) throw AlreadyExist(); pack.setValues(login, passwd); clients << pack; return (pack); }
/* 向指定终端发送消息 * 输入参数:client_list *head,客户端列表头结点 * int sock_fd,指定终端的sockfd * char *str_send,待发送的字符串 * int len,字符串长度 * 返回值:int,成功发送返回0,否则返回-1*/ int sendToClient(client_list *head, int sockfd, char *str_send, int len) { int ret = 0; if ((NULL == head) || (sockfd <= 0) || (NULL == str_send) || (len <= 0)) return --ret; /* 输入错误的sockfd */ if (!(searchClient(head, sockfd))) { printf("输入的sockfd未找到,请重新输入\n"); return --ret; } /* 向客户端发送消息 */ if (!(send(sockfd, str_send, len, 0))) ret--; return ret; }
void DataBase::getContactList(const ClientPacket &pack, std::list<std::string> &list) { const std::string login = pack.getLogin(); const std::string fname(this->DBDirectory + login.substr(0, 1) + "friends" + this->DBExtension); const std::string cname(this->DBDirectory + login.substr(0, 1) + "data" + this->DBExtension); if (login == "" || !clients.openFile(cname) || !searchClient(login)) throw NotExist(); if (!friends.openOCreate(fname)) throw FileError(); // list.clear(); // clear la liste ? while (friends.good() && !friends.eof()) { friends >> fpack; if (!fpack.isErased() && fpack.getOrig() == login) list.push_back(fpack.getFLogin()); } }
/*Handles and decodes client RRQ or DATA Packets*/ int handleClientRequest(int sockfd) { struct sockaddr_in clientaddr; /* client addr */ struct hostent *hostp; /* client host info */ char *hostaddrp; /* dotted decimal host addr string */ char sendbuf[516] = {'\0'}; char *buff; int clientfd=0; int n; socklen_t clientlen; buff=(char *)malloc(sizeof(struct RRQ_Packet)); clientlen = sizeof(clientaddr); /* * recvfrom: receive a UDP datagram from a client */ memset(buff,0, 516); n = recvfrom(sockfd, buff, sizeof(struct RRQ_Packet), 0,(struct sockaddr *)&clientaddr,&clientlen); printf("\n Got a client request"); int len; uint16_t opcode; char filename[512]; uint16_t acknum; memset(&opcode,0,sizeof(uint16_t)); memcpy(&opcode,buff,sizeof(uint16_t)); opcode=ntohs(opcode); if (opcode == 1) { if((clientfd=create_socket())>0) { printf("Client got socket descriptor : %d",clientfd); } memset(&filename,0,512); memcpy(&filename,buff + sizeof(uint16_t),512); len=strlen(filename); filename[len]='\0'; if (n < 0) error("ERROR in recvfrom"); /* * gethostbyaddr: determine who sent the datagram */ hostp = gethostbyaddr((const char *)&clientaddr.sin_addr.s_addr, sizeof(clientaddr.sin_addr.s_addr), AF_INET); if (hostp == NULL) error("ERROR on gethostbyaddr"); hostaddrp = inet_ntoa(clientaddr.sin_addr); if (hostaddrp == NULL) error("ERROR on inet_ntoa\n"); printf("\nOpcode from client %s: %d",hostaddrp,opcode); fflush(stdout); printf("\nFilename from client %s: %s",hostaddrp,filename); fflush(stdout); fp= fopen(filename, "rb"); addClient(clientfd,fp); struct client *client1; client1=searchClient(clientfd); if(client1!=NULL) { printf("\nclient fd :%d",client1->clientfd); } // obtain file size FILE *fp1; fp1=fopen(filename, "rb"); if(fp1!=NULL) { fseek (fp1 , 0 , SEEK_END); int lSize = ftell (fp1); fclose(fp1); if(lSize>MAX_FILE_SIZE) { n=senderrorpacket(2, sendbuf, sockfd, clientaddr, clientlen); printf("Exceeded maximum file size \n"); } } if(!(client1->fp)) { n= senderrorpacket(1, sendbuf, sockfd, clientaddr, clientlen ); printf("File not found \n"); } else { client1->block_no = 1; senddatapacket(&(client1->fp), client1->block_no, sendbuf, client1->clientfd, clientaddr, clientlen ); if((client1->fp)==NULL) { printf("File pointer now set to NULL."); fflush(stdout); } } }//if opcode==1 else if( opcode ==4) { memset(&acknum,0,sizeof(uint16_t)); memcpy(&acknum,buff + sizeof(uint16_t),sizeof(uint16_t)); acknum = htons(acknum); printf("\nOpcode from client : %d",opcode); fflush(stdout); printf("\nAck num from client : %d",acknum); fflush(stdout); struct client *client2; client2=searchClient(sockfd); if(client2!=NULL) { if (acknum == client2->block_no) { printf("Inside if acknum=blocknum"); fflush(stdout); client2->block_no = (client2->block_no+1)%65536; printf("blocknum : %d",client2->block_no); fflush(stdout); if(client2->fp==NULL) { printf("End of file transfer"); } else if(client2->fp!=NULL) { if(feof(client2->fp)) { fclose(client2->fp); fp= NULL ; printf("In opcode==4 File transmitted successfully \n"); fflush(stdout); } else { printf("In else ACK block"); fflush(stdout); senddatapacket(&client2->fp, client2->block_no, sendbuf, sockfd, clientaddr, clientlen); } } } //acknum==blocknum }//client2!=NULL }//if opcode==4 return clientfd; }
int main(int argc, char *argv[]){ //Verificação de argumentos da main para o -t if(argc >= 2 && strcmp(argv[1], "-t") == 0 ) port = atoi(argv[2]); fd=socket(AF_INET,SOCK_DGRAM,0); memset((void*)&serveraddr,(int)'\0', sizeof(serveraddr)); serveraddr.sin_family=AF_INET; serveraddr.sin_addr.s_addr=htonl(INADDR_ANY); serveraddr.sin_port=htons((u_short)port); if(bind(fd,(struct sockaddr*)&serveraddr,sizeof(serveraddr))== -1){ printf("deu erro no bind\n"); exit(-1); } while(1){ addrlen=sizeof(clientaddr); if(recvfrom(fd,buffer,sizeof(buffer),0, (struct sockaddr*)&clientaddr, &addrlen) == -1){ printf("erro na recepção de mensagem do servidor\n"); exit(-1); } if(strncmp("REG", buffer, 3)==0){ i = 0; while(buffer[i+3]!='\n'){ bufferid[i] = buffer[i+4]; i++; } ip = strtok(bufferid, " "); portstr = strtok(NULL, "\n"); sl = insertServer(ip, portstr, sl); auxServer = searchServer(ip, portstr, sl); printf("Server: %s %s - #%d\n", auxServer->ip, auxServer->port, auxServer->intNr++); addrlen=sizeof(serveraddr); if(sendto(fd,str,strlen(str)+1,0,(struct sockaddr*)&clientaddr,addrlen) == -1){ printf("erro no envio de mensagem do servidor\n"); exit(-1); } } if(strncmp("UPD", buffer, 3)==0){ i = 0; while(buffer[i+3]!='\n'){ bufferid[i] = buffer[i+4]; i++; } ip = strtok(bufferid, " "); portstr = strtok(NULL, " "); name = strtok(NULL, "\n"); if((auxClient = searchClient(name, cl)) == NULL){ cl = insertClient(name, cl); auxClient = cl; } auxServer = searchServer(ip, portstr, sl); printf("Server: %s %s - #%d\nClient: %s - #%d\n", auxServer->ip, auxServer->port, auxServer->intNr++, auxClient->name, auxClient->intNr++); addrlen=sizeof(serveraddr); if(sendto(fd,str,strlen(str)+1,0,(struct sockaddr*)&clientaddr,addrlen) == -1){ printf("erro no envio de mensagem do servidor\n"); exit(-1); } } } close(fd); }