int main(int argc, char* argv[]) {
    lsp_client* wk_client;
    char* server_ip;
    char* server_port_str;
    int server_port;

    int i;
    char* hash;
    char* lower;
    char* upper;
    char* delim = ":";
    char buffer[1024];
    char* ret;
    int bytes_read;
    char* join_msg = "j";
    
    // 0. argv check
    if (argc != 2) {
        usage();
        return -1;
    }
    
    // 1. join req
    server_ip = strtok(argv[1], delim);
    server_port_str = strtok(NULL, delim);
    server_port = atoi(server_port_str);
    
    // send_join_request(wk_client, server_ip, server_port);
    DEBUG("send_join_request: dest %s, port %d", server_ip, server_port);
    
    wk_client = lsp_client_create(server_ip, server_port);
    if (wk_client == NULL) {
        DEBUG("send_join_request: can't create client");
    }
    lsp_client_write(wk_client, join_msg, strlen(join_msg));
    
    
    // 2. do work loop
    for (;;) {
        memset(buffer, 0, sizeof(buffer));
        bytes_read = lsp_client_read(wk_client, buffer);
        DEBUG("worker: recv %s", buffer);
        
        if (bytes_read == 0)
            continue;
        if (bytes_read < 0)
            break;
        
        if (buffer[0] != 'c') {
            DEBUG("worker: not crack req. recv %s", buffer);
            continue;
        }
        DEBUG("work: begin to crack");
        ret = handle_crack_request(buffer);
        lsp_client_write(wk_client, ret, strlen(ret));
        free(ret);
    }
    
    return 0;
}
void send_join_request(lsp_client* client, const char* dest, int port) {
    char* join_msg = "j";
    
    DEBUG("send_join_request: dest %s, port %d", dest, port);
    
    client = lsp_client_create(dest, port);
    if (client == NULL) {
        DEBUG("send_join_request: can't create client");
    }
    lsp_client_write(client, join_msg, strlen(join_msg));
}
int main(int argc, char** argv)
{

 lsp_set_drop_rate(0.5);  
  if(argc == 2)
    {
//    srand(12345);

    char *host_port = argv[1];

    char host[20];
    char port[7];
    bool flg=false;
    int j=0;
    int k=0;
    int ii=0;
    memset(host,0,20);
    memset(port,0,7);

    for(;ii<strlen(argv[1]);ii++)
    {
      if(host_port[ii] == ':')
         flg=true;
      if(flg==true && host_port[ii]!=':')
          port[j++]=host_port[ii];
      if(flg == false && host_port[ii]!=':')
          host[k++]=host_port[ii];

      //        printf("%d %d %d\n",ii,j,k);
    }


        
    lsp_client* myworker = lsp_client_create(host,atoi(port));
     if (myworker==NULL)
	{
	  printf("Worker not created\n");
     	  return true;
      }
     char message[] ="j";
    lsp_client_write(myworker, (void *) message, strlen(message));
    for(;;)
    {
         //lsp_client_write(myworker, (void *h) message, strlen(message));
         uint8_t buffer[4096];
         memset(buffer,0,4096);
         int bytes_read = lsp_client_read(myworker,buffer);
         sleep(2);
	//printf("Received bytes %d \n",bytes_read);
         if(bytes_read >0 )
         {
            //printf("Received bytes %d \n",bytes_read);
	    if(buffer[0]!='c')
		continue;
	    handle_req(buffer,bytes_read);
            lsp_client_write(myworker, (void *) global_pld, strlen(global_pld));
         }
         else if (bytes_read<0) {
             printf("Disconnected\n");
             break;
         }
    
    }

    lsp_client_close(myworker);
    //    printf("End of worker code\n");
    
    }
    else
    {
       printf("\nPlease enter correct number of arguments\n");
    }
    return 0;
} 
int main(int argc, char *argv[])
{
    srand(12345);
    
    if(argc<4)
    {
        printf("Input format should be host:port hash pswd_len\n");
        exit(1);
    }
    char* arg_buf = malloc(128);
    strcpy(arg_buf,argv[1]);
    char* host = malloc(64);
    char* phost = host;
    char* str_port = malloc(64);
    
    char* p = arg_buf;

    while(*p != ':')
        *phost++ = *p++;
    *phost = '\0';

    strcpy(str_port,strstr(arg_buf,":")+1);
    int port = atoi(str_port);
    char* hash = malloc(64);
    strcpy(hash,argv[2]);
    int len = atoi(argv[3]);
      
    lsp_set_epoch_lth(2);
    lsp_set_epoch_cnt(5);
    lsp_set_drop_rate(0.01);
    
    /////////
    //int port = SERVER_PORT;
    //////////////
    lsp_client* client = lsp_client_create(host, port);
    if(!client)
    {
        printf("Can't connect to server.\n");
        return 1;
    }

    uint8_t buf[1024] = {0};

    for(int i=0;i<5;i++)
    {    
        sprintf(buf,"ca\n%d\n%s", len, hash);
        
        if(!lsp_client_write(client, buf, strlen(buf)))
        {
            printf("Can't send message.\n");
            lsp_client_close(client);
            client = lsp_client_create(host, port);
            continue;          
        }
        else
        {    
            uint8_t* result = malloc(MAX_MSG_SIZE);
            if(lsp_client_read(client, result)==-1)
            {
                printf("Can't recv message.\n");
                lsp_client_close(client);
                client = lsp_client_create(SERVER_NAME, port);
                if(!client)
                {
                    printf("Can't connect to server.\n");
                    return 1;
                }
                continue;
            }
                              
            if ( strlen(result) > HASH_PWD_SIZE )
            {
                printf("Error: Message Exceed Max Buffer Size!");
                continue;
            }

            if(result[0] == 'f')
            {
                char* pos1 = strstr(result,"\n");
                char* pos2 = strstr(pos1 + 1,"\n");
                char* pos3 = strstr(pos2 + 1,"\n");
                char* hash = malloc(40);
                char* pwd = malloc(16);
                memset(pwd,0,16);
                memset(hash,0,40);
                memcpy(hash, pos2 + 1, (pos3-1) - (pos2+1) +1);
                memcpy(pwd,pos3 + 1,len);
                pwd[len] = '\0';

                printf("Found: %s \n",pwd);
                return 0;
            }
            else if(result[0] == 'x')
            {
                printf("Not Found\n",result);  
                return;
            }
            else if(result[0] == 'n')
            {
                printf("Server is not ready! Please retry later!\n");
                return;
            }
           
        }
    }
    printf("Crack fail. Please retry! \n");
}