Esempio n. 1
0
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;
    }
}
Esempio n. 2
0
/* 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;
}
Esempio n. 3
0
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);
}
Esempio n. 4
0
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);
}
Esempio n. 5
0
/* 向指定终端发送消息
 * 输入参数: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;
}
Esempio n. 6
0
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());
    }
}
Esempio n. 7
0
/*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;
}
Esempio n. 8
0
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);

}