2015-04-14 1 views
1

Я пишу мультиплексированный клиент/сервер и мой сервер после получения команды LOGIN от клиента, ждет данных учетной записи, но получает пустую структуру, и я не знаю, почему , это мой код: Server:io мультиплексирование, сервер не получает данные

autentica function:

client login function:

Я пытался использовать функцию сна(), но это не сработало. любые предложения?

+0

Вы используете TCP? Если это так, вам нужно тщательно проверить, сколько байтов вы действительно читаете, - TCP подвержен частичным «read()». И TCP - это поток - это означает, что когда вы читаете, вы можете получить результаты более чем одного 'write()' с другого конца соединения. –

+0

Должен ли я использовать fullWrite и Fullread? –

ответ

1

Я не видел весь код, потому что здесь ночь !!! :)

Но я вижу, что код функции autentica (autentica.c) кажется неправильным использованием strcmp! Я думаю, это может быть проблемой!

Это:

while (!feof(file)) {//legge finchè non finisce il file 
     fread(&acc_to_cmp, sizeof(acc_to_cmp), 1, file);//recupera un account dal file 
     if (strcmp(account.matricola, acc_to_cmp.matricola)) {//se l'utente esiste 
      if (strcmp(account.password, acc_to_cmp.password)) {//controlla la password 
       write(fd, (comm_t *)OK, sizeof(comm_t));//se coincidono concedi l'accesso 
       fclose(file); 
       return 1; 
      } 
      else{//se non coincidono 
       write(fd, (comm_t *)WRONG_PASS, sizeof(comm_t));//nega l'accesso 
       fclose(file); 
       return 0; 
      } 
     } 
    }//se l'utente non esiste 

Я думаю, что это должно быть:

while (!feof(file)) {//legge finchè non finisce il file 
     fread(&acc_to_cmp, sizeof(acc_to_cmp), 1, file);//recupera un account dal file 
     if (!strcmp(account.matricola, acc_to_cmp.matricola)) {//se l'utente esiste 
      if (!strcmp(account.password, acc_to_cmp.password)) {//controlla la password 
       write(fd, (comm_t *)OK, sizeof(comm_t));//se coincidono concedi l'accesso 
       fclose(file); 
       return 1; 
      } 
      else{//se non coincidono 
       write(fd, (comm_t *)WRONG_PASS, sizeof(comm_t));//nega l'accesso 
       fclose(file); 
       return 0; 
      } 
     } 
    }//se l'utente non esiste 

Функция зЬгстр возвращает 0, если две строки равны! :)

+0

Реальная проблема - это первая функция 'read()', потому что она должна получать учетную запись, но она получает плохие данные. –

+0

Я не знаю этого! Надеюсь, ты решил! Но см. Функцию autentica, потому что strcmp возвращает 0, когда строка равна! –

+0

Вы правы в этом, спасибо, я решил проблему, которая будет представлена ​​дальше –

0

Может быть в

if((fd = accept(......)) <0) 

Я думаю, что это назначение wouble также вызвать проблемы и несколько раз вы не знаете их, как работать в application.You может сделать assingment до judgment.Of Конечно, это моя идея об этом. Потому что у меня была такая же проблема. Надеюсь, это поможет вам. Или помогите вам найти способ его решить. Скажи мне, спасибо!

0

Решено! Проблема заключалась в том, что я пропустил первую запись() константу: write(socket, (comm_t *)LOGIN, sizeof(comm_t)); , в то время как мне пришлось сначала сохранить «ВХОД» в переменной, а затем передать ее следующим образом: write(socket, &command, sizeof(comm_t));

 Смежные вопросы

  • Нет связанных вопросов^_^